C++ als Einsteiger lernen.

Ich glaub kaum, daß du den Optimierungsgrad eines Compiler erreichen kannst, besonders nicht bei recht großen Programmen.
Allein durch die SSE3 Optimierung holt man recht viel raus.

Es ist auch nicht so, daß der Compiler eine schlechtere Optimierung wählt, sondern die Library schaut nach geeignenten Optimierungen.
Und es ist nun echt nicht Intel verwerflich, daß sie eben keine AMD Optimierung bieten können, da auch falsche Optimierung ein Programmablauf stark verändern kann.
Allerdings sollten sie dann wenigstens AMD Zuganggewähren, die optimalen Optimierungen in die Library einzufügen.
Es wird aber nicht jede Optimierung weg gelaßen, aber einige wichtige fehlen doch durch aus, selbst wenn es eine Standardoptimierung ist, welche auch bei AMD Prozessoren ohne Probleme laufen würde. (Es sind trotzdem nicht alle deaktiviert)
Aber lieber mal was glauben als was wissen, ne. ;)

Ansonsten geb ich dir recht, ein Hobby Programmierer muss nicht unmengen an Geld nur für den Compiler ausgeben.
Für das Standardzeug reicht auch der MSVCC oder GCC.
 
Der Intel-Compiler checkt halt den Vendor-String der CPUID. Wenn da nicht "GenuineIntel" drinnen steht, wird nix/wenig optimiert.

Afaik ist es bei anderen Compilern idR so, dass du spezielle Instrincts nutzen musst, damit die entsprechenden SIMD-Optimierungen automatisch greifen. Ist mir zumindest noch nicht aufgefallen, dass VC++ selbst geschriebenen Code von Haus aus mit sowas überzieht (ich rede jetzt nicht von den bereits kompilierten Libs, die enthalten durchaus entsprechende Optimierungen).

Achja, ich hatte damals bei VS2003 auch in asm geschriebene Libs für memcpy etc. verwendet - und die waren schneller :D
 
Der Compiler checkt schonmal garnichts, der übersetzt höchstens.
Wenn dann prüfen seine Librarys und die selektieren natürlich auch aus (hab ich ja auch nicht anders behauptet).
Da wiedersprech ich dir nicht, aber selbst diese minimale Optimierung zieht den GCC ruhig ab.

Außerdem, selbst geschriebene asm codes werden dann vom optimieren ignoriert.
Somit eher nachteilig, dann lieber als Objektdatei linken.
Außerdem ist die GCC memcpy Library wirklich schnell, da kommt man mit hübschen mov's auch nicht viel schneller voran.
Vllt hattest du auch -O3 einfach vergessen? :D

Und bitte nicht wieder AFAIK.
 
GCC nutze ich doch garnicht, habe doch von Visual Studio gesprochen o0

Naja, meine Lib war auf C ausgelegt und sie war damals schneller. Heute mach ich das meiste eh mit Inline-Assembler (was allerdings sehr selten geworden ist), sofern es sich denn überhaupt lohnt. Habe letztens mal just for fun eine Funktion zum Ändern der Lautstärke eines Sample-Puffers geschrieben, im Vergleich konnte ich mit MMX grade mal nen Speedup von 1,4 erreichen. Wobei MMX ja auch schon nen langen Bart hat :ugly:

http://img190.imageshack.us/img190/9685/mmx01a.jpg

Das wurde mit Visual Studio 2008 und Inline-Assembler erstellt. VS nutzt keine SIMD-Instruktionen (hab's mal Disassembliert), kann aber sein, dass ein moderner Prozessor die Pipeline ganz gut füllen kann...
 
Auch beim MSVCC gibt es den -O3 Parameter, hilft enorm. (Damit werden auch einige altlasten bereinigt)

Aber eben für einen Anfänger tuts Code::Blocks + GCC oder gleich MS Visual Studio genauso.
Und das beste: kost nix. :D

Für einen Hobbyprogrammierer zählt Geschwndigkeit eben nicht alles, sofern man nicht arsch lahme Sprachen nimmt.

Hier ein kleiner Becnhmark überblick:
Which programming languages are fastest? | ComputerLanguageBenchmarksGame
 
Jo, das reicht definitv aus. Mein Erfahrung ist eh, dass der Großteil der Geschwindigkeit durch den Algorithmus kommt und nicht die Implementierung. Wenn ich nen schlechten Algo implementiere, wird's halt nicht besser ;)

Und in der heutigen Zeit, mit Java, C# und Konsorten, fallen ASM-Optimierungen eh flach :D
 
Zum Intel-Compiler: Ich habe gelesen, dass der kompilierte Code auf AMD-Maschinen messbar schneller wird, wenn man den Vendor-Flag in der CPU mit „genuineintel“ überschreibt.

Aber jeder Compiler hat seine Macken: Der MS-Compiler akzeptiert ohne explizite Einbindung einige „Microsoft Extensions“ im Code, die GCC akzeptiert ebenfalls C++, das nicht dem Standard gehorcht. So erzieht man seine User quasi, dass sie nur für den eigenen Compiler schreiben. Habe sogar schon gehört, dass MS-ld (oder wie man das nennen soll) automatisch gegen Systemlibs verlinkt, die man eigentlich nicht braucht. Damit hat man dann eine erhöhte Abhängigkeit im Binärcode. (Wie gesagt: Hörensagen. Aber Code, der nur auf dem g++ oder mit MSc++ (oder wie die den nennen) kompiliert, habe ich schon häufiger gesehen. Einfach Grütze, gar nicht erst mit so nem Scheiß anfangen.)
 
Klar ist der da eingebrannt. Aber er wird ja von der Software nicht direkt aus der Hardware ausgelesen. Unter Linux wird sogar in einer profanen Textdatei (/proc/cpuinfo) nachgeschaut, die man ohne weiteres manipulieren kann:
Code:
cat /proc/cpuinfo 
processor	: 0
vendor_id	: GenuineIntel
cpu family	: 15
model		: 107
model name	: AMD Athlon(tm) 64 X2 Dual Core Processor 6000+
stepping	: 2
cpu MHz		: 3100.000
cache size	: 512 KB
physical id	: 0
siblings	: 2
core id		: 0
cpu cores	: 2
apicid		: 0
initial apicid	: 0
fpu		: yes
fpu_exception	: yes
cpuid level	: 1
wp		: yes
flags		: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt rdtscp lm 3dnowext 3dnow rep_good extd_apicid pni cx16 lahf_lm cmp_legacy svm extapic cr8_legacy 3dnowprefetch
bogomips	: 6186.06
TLB size	: 1024 4K pages
clflush size	: 64
cache_alignment	: 64
address sizes	: 40 bits physical, 48 bits virtual
power management: ts fid vid ttp tm stc 100mhzsteps

So wird der Intel-Compiler laut Hörensagen schnelleren Code erzeugen. Diese Abfrage würde ich denen zutrauen: Macs gibt es auch erst flächendeckend in Waschmaschinenfachgeschäften, seit Intel-CPU verbaut sind. (Habe allerdings keinen Intel-Compiler die GCC ist schnell genug.)
 
Der Compiler läuft ja nicht auf Kernel-Ebene. Woher soll der denn die Info haben, wenn nicht vom Kernel? Und der Kernel schmeißt es halt in /proc/cpuinfo raus.
 
Ich meinte sowas in der Art:
Code:
void getVendorString(char *ret)
{
    __asm {
        mov eax, 0
        cpuid
        // Verarbeiten/rückgabe
    }
}
 
Zurück