Vinnaren i pepparkakshustävlingen!
  • 2
  • 3
2017-03-18, 13:32
  #25
Medlem
Citat:
Ursprungligen postat av WbZV
Jag förstår inte riktigt vad du menar med "motvikt till objektorienterad design", inte heller hur mängden specialkod skulle minska eller hur lokala minnespooler kommer in i bilden.

Det finns mycket riktigt ett grundläggande problem som uppstår när man går från att arbeta med POD-typer till klass-typer med konstruktorer och destruktorer. Kompilatorns kontrakt är att den får göra vad den vill med koden så länge det inte påverkar det logiska resultatet av ett väldefinierat program. Eftersom POD-typer är transparenta är det uppenbart för kompilatorn att temporärer av sådan typ kan optimeras bort utan att kontraktet bryts. Temporärer av klass-typ kan däremot ha konstruktorer och destruktorer som antingen är helt okända för kompilatorn, eller i sin tur innehålla anrop med oöverblickbara sidoeffekter. Oöverblickbara sidoeffekter leder till så kallade kompilatorbarriärer, som krafigt begränsar kompilatorns optimeringsmöjligheter.

Move-semantiken löser inte problemet, men det begränsar det. En vektors konstruktor anropar new för att allokera en buffer och en vektors destruktor anropar delete för att frigöra bufferten. Anrop till new och delete är alltid kompilatorbarriärer, men med move-semantik kan en vektor dessutom ha en move-konstruktor som är fri från kompilatorbarriärer då den inte behöver anropa new/delete. Därmed ges kompilatorn möjlighet att optimera bort skapandet av temporära vektorer utan att bryta mot kontraktet.
Men du lyckas ju själv beskriva problemet så borde du ju ha förstått min poäng. Enkapsulering med objekt ger traditionellt mer minnesallokeringar eftersom användare i fler fall behöver ta kopior på data i stället för att direkt accessa.

Med fler kopieringar får man fler minnesallokeringar.

Med move-semantik kan man minska den totala mängden kopieringar - alltså minska den totala mängden minnesallokeringar.

Den rena exekveringstiden för en extra new/delete motsvarar stora mängder kod och rent kopiösa mängder kodoptimering för att kompensera för. Så i stort sett alla lösningar som får bort en minnesallokering ger en tidsvinst.
Citera
2017-04-22, 02:33
  #26
Medlem
Citat:
Ursprungligen postat av mobiustrip
Jag tror du förenklar det hela lite för mycket, Hello World ett väldigt dåligt exempel på program. Så fort du börjar få mer komplexa datastrukturer och många förgreningspunkter så är vi människor, trots att vi kanske kan skriva kompaktare kod, sämre än maskiner. Kolla på https://en.wikipedia.org/wiki/LLVM som bl.a kan JIT och på det sättet omkompilera vissa delar runtime baserat hur ditt program beter sig.
Detta är emellertid en myt. Särskilt stämmer det inte in för exotiska arkitekturer för vilka kompilatorer är mindre utvecklade. Kompilatorer idag genererar dock extremt bra kod, det är sant, särskilt för språken C och C++. Att överträffa dem genom manuell assemblerprogrammering är sällan värt det och precis som du säger blir det mindre realistiskt i takt med storlek och komplexitet. Det finns dock tillfällen. Det är dessutom något som kräver ordentlig kännedom för arkitekturen i fråga.

JIT är dessutom irrelevant då det snarare är schemaläggning över exekveringen snarare än generering utav kod.

Fibonaccital <= 2⁶⁴ - 1 .
Kod:
		xor rax, rax
		mov rdx, 1
.1:		xadd rax, rdx
		jno .1

Det är en fråga om redundans (ej i datavetenskaplig mening!). Det behövs helt enkelt inte längre. Trenden kvarstår dock (av naturliga skäl), varför exempelvis operativsystemskärnor implementeras i C.

EDIT: På frågan om design (omnämns i ditt inlägg som komplexa datastrukturer och förgreningar) är det en bedrift vi först och främst skall tillskriva programmeringsspråken och inte kompilatorn. Hårklyverier möjligtvis. Alla erfarna programmerare känner till (som nämnts tidigare i tråden) att ett programs övergripande design, snarare än enstaka instruktioner optimerade för maskintid, är vad som räknas för stora program att lösa välforumlerade problem.

Tänk kryptografiska attacker. Exhaustive search ("bruteforce") kommer oavsett hur kompakt och maskineffektiv kod som helst, alltid att vara sista utvägen skulle det finnas mer sofistikerade attacker.

Bara mina tankar .
__________________
Senast redigerad av vlkmslf 2017-04-22 kl. 02:43.
Citera
2017-04-28, 17:06
  #27
Medlem
Mer om assembler-optimering:
http://www.azillionmonkeys.com/qed/asmexample.html
Citera
2017-05-01, 23:54
  #28
Medlem
Citat:
Ursprungligen postat av grabb1948
Mer om assembler-optimering:
http://www.azillionmonkeys.com/qed/asmexample.html
Tackar
Citera
  • 2
  • 3

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback