söndag 12 juli 2009

C tecken vs C++ strängar

De som har arbetat med mig som programmerare vet att jag är ett performance freak ända in i benmärgen som vill ha enkel, effektiv och smal, minnessnål kod. Överabstraherad och fet kod finner jag rent av motbjudande och för min del tyder det på att programmeraren antingen inte förstår datorer och programmering eller problemet som ska lösas korrekt. Ofta leder dessa abstraktioner inte bara till långsammare och fetare programkod utan tar dessutom längre tid att skriva och underhålla då kodmängden växer dramatiskt.

Själv så har jag länge varit tveksam till överdriven och rutinmässig användning av C++ std::string då jag anser att C:s vanliga strängfunktioner på teckenarrayer är genialt enkla och effektiva. Visst finns det fördelar med std::string, men man bör inte använda dem för rutinmässigt utan främst där det är klart motiverat.

Jag har dock haft svårt att övertyga andra om min ståndpunkt då jag saknat konkreta siffror, men nyligen hittade jag en intressant jämförelse mellan olika itoa() funktioner implementerade både i C- och C++-style. Källkoden till båda rutinerna finns högre upp på sidan.

Att den bästa std::string implementationen av itoa() tar över 50x längre tid än motsvarande C-implementation finner även jag förvånande, jag hade snarare förväntat mig 10-20x, men det visar helt klart min poäng. Traditionellt sett så har den största fördelen med std::string varit den referensräkning och det "copy-on-write" beteende som har varit inbyggt och lett till minnesbesparingar och snabba strängjämförelser och kopieringar. Tyvärr håller denna fördel på att försvinna i nyare implementationer då referensräkning fungerar dåligt i kombination med dagens mer kraftigt trådade applikationer som behövs för att utnyttja våra moderna processorer som växer i antal kärnor istället för linjär exekveringshastighet. Man väljer därför i allt högre grad att överge copy-on-write eftersom man annars riskerar dyra race-conditions mellan olika trådar så fort referensräknaren måste ökas och man därmed måste skriva till ett objekt som potentiellt delas mellan flera trådar.

Nej, std::string bör man absolut inte använda i tidskritiska rutiner eller bibliotek som kan komma att användas av dessa och, anser jag, med måtta även i övrigt.

Inga kommentarer:

Skicka en kommentar