2012-05-20 5 views
7

Ich programmiere ein Spiel und möchte eine Platine mit einem Array darstellen. Ich suche nach Effizienz, da ich viele Iterationen machen werde. In diesem Fall scheint sowohl ein int-Array als auch ein char-Array für die Board-Darstellung geeignet zu sein. Gibt es einen Unterschied in Bezug auf die Effizienz beim Ausführen von Operationen in einem int-Array und einem char-Array?Effizienz: Char-Array vs Int-Array

Ich vermute, dass, da jedes Element des Char-Array hat die Größe von 1 Byte kann es wegen einer anderen Darstellung im Speicher langsamer sein (Betrachten Sie einen modernen Computer, der mindestens 32 Bit für Int-Darstellung hat) ... Am I Recht?

Vielen Dank im Voraus.

EDIT: Ich werde Spielbäume generieren, deshalb ist Effizienz so wichtig und kleine Unterschiede im Zeitverbrauch können einen großen Unterschied machen.

+0

Ich kann mir keinen Grund denken, 'char' wäre langsamer. Wenn überhaupt, hängt es möglicherweise davon ab, welche Vorgänge Sie ausführen, es kann schneller sein. Bei eingebetteten Zielen mit 8-Bit-Architektur wären 'int'-Operationen langsamer. – jedwards

+0

Vielleicht, aber ein 'char'-Array belegt weniger Speicher, was es schneller macht als ein' int'-Array, wenn es genügend Elemente hat. –

Antwort

5

Für welche CPU/s?

Einige CPUs können nicht direkt auf etwas zugreifen, das kleiner als "etwas" ist, und der Compiler muss eine Anweisungsfolge "Laden, Verschieben und Maskieren" generieren, um auf einzelne Bytes zuzugreifen. Die Verwendung von int sollte für diesen Fall gewinnen.

Einige CPUs können ohne Probleme auf Bytes zugreifen. In diesem Fall (wenn genügend Daten beteiligt sind, auf die es ankommt) ist das Problem wahrscheinlich die Cachegröße und/oder die Speicherbandbreite; und (zumindest für 80x86) würde ich erwarten, char würde einfach gewinnen, weil mehr Daten in jede Cache-Zeile gepackt wird.

Für welchen Algorithmus/s?

Wenn Sie SIMD werfen können, char ist wahrscheinlich zu gewinnen. Beispielsweise können Sie mit 128-Bit-SIMD 16 Bytes pro Befehl oder 4 (32-Bit) Ganzzahlen pro Befehl verarbeiten, und char könnte allein deswegen viermal schneller sein.

Der beste Rat wäre, etwas zu verwenden, wie:

#ifdef USE_INT 
    typedef int thingy 
#else 
    typedef unsigned char thingy 
#endif 

Dann können Sie es profilieren und es zu ändern, wenn Sie mögen.

+0

+1, aber du hast deinen 'typedef' falsch herum. –

+0

Heh - das ist peinlich - jetzt behoben. Vielen Dank :-) – Brendan

4

char s sind im Allgemeinen 1-Byte ausgerichtet und int s sind im Allgemeinen 4-Byte ausgerichtet. Angenommen, Sie arbeiten mit einem Computer, der diesem Standard entspricht, speichern beide Arrays ihren Inhalt als zusammenhängende Speicherblöcke (das Array int ist 4x größer als das Array char). Daher ist es unwahrscheinlich, dass sich einer hinsichtlich der Art und Weise, wie sie einen Teil des zugewiesenen Speichers verwenden, unterscheidet.

Das gesagt, selbst wenn die zugrunde liegende Speicher-Darstellung anders wäre, bezweifle ich, dass es Auswirkungen auf den Durchsatz Ihres Programms hätte.

+0

Ich stimme dem ersten Satz zu, würde dies aber nicht bedeuten, dass die Int-Darstellung (auf einer 32-Bit-Maschine) würde 4x den Speicher nehmen? Ja, die Blöcke sind zusammenhängend, aber nicht gleich groß. – jedwards

+0

Ich habe meine Antwort aktualisiert, um diesen Punkt zu verdeutlichen (ich nahm an, der Leser würde das aufgreifen, aber vielleicht hätte ich deutlicher sein sollen). –

+0

Ich denke, der Satz, der mich dazu gebracht hat, war: "Es ist unwahrscheinlich, dass sich einer hinsichtlich der gesamten Speicherauslastung unterscheiden wird." - Es sind die Bedingungen der gesamten Speicherauslastung, sie werden unterschiedlich sein, ein 4x die Größe des anderen. – jedwards

3

Versuchen Sie es und sehen. Verwenden Sie die -S-Flag auf gcc den Assembler-Code zu erhalten:

gcc -Wall -S code.c -o code.s 

Sehen Sie, wenn es offensichtliche Unterschiede in der Länge des generierten Codes sind. Dies ist nicht unbedingt die ganze Geschichte, da Sie den Assembler verstehen müssen, um Unterschiede zu beurteilen. Aber es könnte Ihnen einen Hinweis geben - wahrscheinlich, dass Int und Char in etwa gleich sein werden.

Beachten Sie, dass Sie, wenn Sie Typen mischen, fast sicher etwas langsameren Code mit char-Arrays bekommen. Wenn Sie also Daten im char-Array speichern und sie dann irgendwie mit int-Typen "verarbeiten", erhalten Sie wahrscheinlich jedes Mal, wenn eine Konvertierung zwischen den beiden vorgenommen wird, eine zusätzliche Anweisung. Probieren Sie es mit -S.

+0

+1! Das wird der eindeutige Beweis sein, der die Behauptungen bestätigt. Beide tollen Antworten, es ist eine Schande, dass ich nur eine auswählen kann. – PALEN