Ist eine Schichtanweisung schneller als eine IMUL-Anweisung?

8

Welcher ist schneller -

%Vor%

oder

%Vor%

Wie viele Taktzyklen dauert imul im Vergleich zum Schaltbefehl?

    
Kartlee 25.05.2011, 06:05
quelle

4 Antworten

8

In diesem Fall benötigen sie wahrscheinlich die gleiche Anzahl von Zyklen, obwohl Ihre manuelle "Optimierung" ein weiteres Register benötigt (was den umgebenden Code verlangsamen kann):

%Vor%

vs

%Vor%

Der Compiler kann die Stärke reduzieren und wahrscheinlich viel besser als Sie. Wenn Sie Ihren Code auf eine andere Plattform (zB ARM) portieren, weiß der Compiler auch, wie man die Stärke auf dieser Plattform reduziert (x86's LEA bietet verschiedene Optimierungsmöglichkeiten als ARM's ADD und RSB ).

    
ninjalj 30.05.2011, 21:47
quelle
54
___ antwort6120427 ___

Dies ist das 21. Jahrhundert. Moderne Hardware und Compiler wissen, wie man hochoptimierten Code erzeugt. Das Schreiben von Multiplikationen mit Shifts wird die Performance nicht verbessern, aber es wird Ihnen helfen, Code mit Bugs zu erzeugen.

Sie haben das selbst mit Code demonstriert, der sich mit 12 statt mit 10 multipliziert.

    
___ qstnhdr ___ Ist eine Schichtanweisung schneller als eine IMUL-Anweisung? ___ qstntxt ___

Welcher ist schneller -

%Vor%

oder

%Vor%

Wie viele Taktzyklen dauert %code% im Vergleich zum Schaltbefehl?

    
___ answer6181006 ___

In diesem Fall benötigen sie wahrscheinlich die gleiche Anzahl von Zyklen, obwohl Ihre manuelle "Optimierung" ein weiteres Register benötigt (was den umgebenden Code verlangsamen kann):

%Vor%

vs

%Vor%

Der Compiler kann die Stärke reduzieren und wahrscheinlich viel besser als Sie. Wenn Sie Ihren Code auf eine andere Plattform (zB ARM) portieren, weiß der Compiler auch, wie man die Stärke auf dieser Plattform reduziert (x86's %code% bietet verschiedene Optimierungsmöglichkeiten als ARM's %code% und %code% ).

    
___ tag123x86 ___ x86 ist eine Architektur, die von der Intel 8086 CPU abgeleitet ist. Die x86-Familie umfasst die 32-Bit-Architektur IA-32 und 64-Bit x86-64 sowie 16-Bit-Legacy-Architekturen. Fragen zu letzterem sollten mit [x86-16] und / oder [emu8086] getaggt werden. Verwenden Sie das Tag [x86-64], wenn Ihre Frage für 64-Bit x86-64 spezifisch ist. Verwenden Sie für die x86-FPU das Tag [x87]. Für SSE1 / 2/3/4 / AVX * verwenden Sie auch [sse] und alle zutreffenden [avx] / [avx2] / [avx512] ___ tag123optimierung ___ Optimierung ist der Akt der Verbesserung einer Methode oder eines Designs. In der Programmierung nimmt die Optimierung normalerweise die Form an, die Geschwindigkeit eines Algorithmus zu erhöhen oder die benötigten Ressourcen zu reduzieren. Eine weitere Bedeutung der Optimierung sind numerische Optimierungsalgorithmen. ___ tag123assembly ___ Assemblersprache (asm) Programmierfragen. Achten Sie darauf, auch mit dem Prozessor und / oder Befehlssatz, die Sie verwenden, sowie den Assembler TAG. WARNUNG: Verwenden Sie für .NET-Assemblies stattdessen das Tag [.net-assembly]. Verwenden Sie für Java ASM stattdessen das Tag [java-bytecode-asm]. ___ answer6124463 ___

Wenn Sie in einer höheren Sprache alberne "Optimierungen" wie diese per Hand machen, erreichen Sie nichts anderes, als Menschen zu zeigen, dass Sie mit modernen Technologien und Programmierpraktiken nicht vertraut sind.

Wenn Sie direkt in der Assembly schreiben würden, wäre es sinnvoll, sich darüber Gedanken zu machen, aber Sie sind es nicht.

In diesem Fall gibt es eine paar Fälle, in denen der Compiler nicht in der Lage ist, etwas zu optimieren. Betrachten Sie ein Array möglicher multiplikativer Faktoren, die jeweils aus genau 2 Bits ungleich Null bestehen, mit folgendem Code:

%Vor%

Wenn das Profiling zeigt, dass dies ein erheblicher Engpass in Ihrem Programm ist, können Sie Folgendes ersetzen:

%Vor%

solange Sie die Ergebnisse messen möchten. Ich vermute jedoch, dass es selten ist, eine Situation zu finden, in der dies helfen würde oder wo es überhaupt möglich wäre. Es ist nur auf einer CPU mit einer schwachen Multiplikationseinheit im Vergleich zu Verschiebungen und dem gesamten Befehlsdurchsatz plausibel.

    
___ answer6120244 ___

Ich würde sagen, schreiben Sie einfach %code% oder %code% und lassen Sie den Compiler sich über solche Fragen Gedanken machen.

    
___
David Heffernan 25.05.2011 06:31
quelle
9

Ich würde sagen, schreiben Sie einfach val = val * 10; oder val *= 10; und lassen Sie den Compiler sich über solche Fragen Gedanken machen.

    
Henno Brandsma 25.05.2011 06:10
quelle
3

Wenn Sie in einer höheren Sprache alberne "Optimierungen" wie diese per Hand machen, erreichen Sie nichts anderes, als Menschen zu zeigen, dass Sie mit modernen Technologien und Programmierpraktiken nicht vertraut sind.

Wenn Sie direkt in der Assembly schreiben würden, wäre es sinnvoll, sich darüber Gedanken zu machen, aber Sie sind es nicht.

In diesem Fall gibt es eine paar Fälle, in denen der Compiler nicht in der Lage ist, etwas zu optimieren. Betrachten Sie ein Array möglicher multiplikativer Faktoren, die jeweils aus genau 2 Bits ungleich Null bestehen, mit folgendem Code:

%Vor%

Wenn das Profiling zeigt, dass dies ein erheblicher Engpass in Ihrem Programm ist, können Sie Folgendes ersetzen:

%Vor%

solange Sie die Ergebnisse messen möchten. Ich vermute jedoch, dass es selten ist, eine Situation zu finden, in der dies helfen würde oder wo es überhaupt möglich wäre. Es ist nur auf einer CPU mit einer schwachen Multiplikationseinheit im Vergleich zu Verschiebungen und dem gesamten Befehlsdurchsatz plausibel.

    
R.. 25.05.2011 12:30
quelle

Tags und Links