sry das ich hier jetzt nochmal was dazu sagen muss...
aber wenn ich sowas lese:
Quote:
Originally Posted by Akorn
Es gibt listen wo man nachschauen kann welcher befehl mit welchen operanden wieviel takte benötigt.
Beim 8086:
xor braucht 3 takte wenn beide operanden register sind.
mov braucht 4 takte wen der eine operand ein register ist und der 2te ein Immediate wert ist.
|
es tut mir leid wenn ich davon ausgegangen bin, das heute niemand mehr cpus von 1979 nutzt. wenn du noch ein solches urgestein zuhause hast macht es natürlich einen unterschied, ob du xor oder mov nutzt...
heute benötigen allerdings beide befehle nurnoch einen takt... und auf MrSm!ths frage, was genau ich mit der parallelen ausführung meinte, nein ich meinte keineswegs multithreading... die cpus von heute sind so aufgebaut, das bei mehreren befehlen, die keinerlei speicherzugrif benötigen, und bei denen das ergebnis vorheriger aktionen irrelevant sind, parallel ausgeführt werden. somit werden natürlich nicht aus 2 5takt aktionen eine 5takt aktion, aber es können takte eingespart werden.
bin mir nicht sicher, ob man hierzu wirklich aktuelle daten gelistet im netz finden kann, aber wenn man sich denn mit den herstellern der cpus in verbindung setzt, wird einem hier sicher genaueres erklärt.
einfaches beispiel zu dem was ich meinte wäre einfach nur das 10 malige setzen von eax mit 0.
in mov schreibweise:
Code:
mov eax,0
mov eax,0
mov eax,0
mov eax,0
mov eax,0
mov eax,0
mov eax,0
mov eax,0
mov eax,0
mov eax,0
in xor schreibweise:
Code:
xor eax,eax
xor eax,eax
xor eax,eax
xor eax,eax
xor eax,eax
xor eax,eax
xor eax,eax
xor eax,eax
xor eax,eax
xor eax,eax
für den mov befehl ist es in diesem falle absolut irrelevant, welchen wert eax denn nun gerade beinhaltet, so können befehle hier ohne probleme parallel abgearbeitet werden. je nach cpu können hier bis zu 5 takte eingespart werden. was bei 10 takten arbeitsaufwand immerhin 50% sind.
beim xor befehl jedoch muss immer erst der aktuelle eax wert eingelesen werden. selbst wenn es eig irrelevant ist, was in eax steht, kann xor natürlich nur ausgeführt werden, wenn bekannt ist, was denn nun im register steht.
das hat zurfolge, das hier parallele abarbeitung nicht möglich ist, was den aufwand bei 10 takten hält.
auch wenn das beispiel hier relativ sinnlos war, sollte es doch zeigen was ich denn nun meinte.
und wenn MrSm!th nun der meinung ist, das dieser 2 byte unterschied beim speicheraufwand mehr relevanz hat, als der eventuelle effizienzverlust, der hierbei nebenbei gesagt auch absolut lächerlich ist, dann sei es so...
in diesem falle würde ich dir nur raten, die hände von hochsprachen zu lassen, da diese (gerade im falle von c++ compilern) leider alles andere als optimal auf aktuelle hardware ausgelegt sind. wenn du dich wegen 2 byte größenunterschied hier aufregst, solltest du einmal rein in asm geschriebene programme von der größe her mit gleichwertigen in c++ geschriebenen programmen vergleichen.
selbst wenn du ein wirklich großes programm schreiben solltest, welches sich mit 500mb oder noch mehr im speicher ablegt, machen diese wenns hoch kommt 500kb die du durch das nutzen von xor statt mov um register 0 zu setzen, auch nichts mehr aus...
heute wird doch aufgrund der sich rasant entwickelnden hardware, durch abstraktion eig. immer mehr wert darauf gelegt, die sprachen möglichst userkomfortabel zu machen, und nicht so hardware nahe wie möglich zu halten, um so wenige takte bzw bytes im speicher freihalten zu können...