2011-01-06 7 views
1

Meine Frage bezieht sich speziell auf iPhone, iPod und iPad, da ich davon ausgehe, dass die Architektur einen großen Unterschied macht. Ich hoffe, dass es irgendwo eine Spezifikation gibt (vielleicht für die verschiedenen Chips), oder eine zuverlässige Methode, T für jede spezifische Anweisung zu messen. Ich weiß, dass ich eine beliebige Anzahl von Werkzeugen verwenden kann, um die insgesamt verbrauchte Prozessorzeit, den verwendeten Speicher usw. zu messen. Ich möchte auf einer niedrigeren Ebene quantifizieren.Wie finde ich den Zeitwert der Operation, um den neuen Algorithmus zu optimieren?

So kann ich herausfinden, wie oft ich durch den Hauptteil des Algorithmus gehe. Zum Beispiel iteriere ich n * (n-1) mal in einer naiven Implementierung und zwischen n (bester Fall) und n + n * (n-1) (schlimmster Fall) in einem anderen. Ich kann auch die Gesamtzahl der Anweisungen (+ - =% * /, und logische Anweisungen) vernünftig zählen, und ich kann diese Zahlen vergleichen, aber das bedeutet, dass das Gewicht jeder Operation gleich ist. Außerdem habe ich keine Ahnung, wie man den tatsächlichen Zeitwert einer logischen Aussage (falls sonst, für, während) gegenüber einem mathematischen Operator ... gewichtet, ist "wenn" so viel Arbeit wie "+" jedes Mal, wenn ich benutze es? Ich würde gerne wissen, wo ich diese Informationen finde.

Aus Gründen der Klarheit ist es mein Ziel herauszufinden, wie viel Prozessorzeit ich von der CPU (oder GPU oder einem U) benötige, um einen optimalen Algorithmus für die Prozessorzeit zu entwickeln. Kann mir jemand eine Idee geben, wo ich für iOS-Hardware anfangen soll?

Edit: This link to ClockServices.c und SIMD Zeug im Entwickler-Portal könnte ein guter Anfang für Leute, die daran interessiert sind. Ein paar weitere Tassen Kaffee heute Abend und ich könnte durchkommen;)

+0

Das meiste, was ich bewerten möchte, ist nur C. Ich wäre damit glücklich. Es wäre jedoch nett, die Kosten für die Iteration durch ein NSArray zu kennen; aber das hört sich an, als könnte es komplex und variabel sein. Ich weiß einfach nicht, wie viel ich hoffen kann, es herauszufinden ... Ich werde mich mit den grundlegenden C-Operationen sicher zufrieden geben;) – Rab

+0

Ja, ich dachte daran (die Million Tests), aber es ist ein guter Kommentar. Ich dachte über Lauftests nach, wie Sie sagen, aber ich habe zwei Ängste über die Ergebnisse. Einer davon ist, dass mein Test in gewisser Weise naiv sein wird, und ich werde eine Menge Arbeit für Informationen leisten, die nicht bestehen, wenn der Compiler sich entscheidet, etwas anderes zu tun. Zweitens habe ich nur ein paar Geräte und einige haben unterschiedliche Chips.Meine liebste Hoffnung ist vielleicht, dass jemand Diagramme mit genauen Schätzungen für den Zeitwert von C-Operationen für einen bestimmten Prozessor hat. – Rab

+0

Bekam ein Kichern aus dem NSArray-Kommentar. Ich hoffe mein NSArray bluescht mich nicht oder so;) – Rab

Antwort

2

Auf einer modernen Plattform ist die Prozessorzeit nicht der einzige einschränkende Faktor. Oft ist der Speicherzugriff.

Dennoch Prozessorzeit:
Ihr grundlegender Ansatz bei einer Schätzung für die Prozessorlast ist in Ordnung, aber, und ist sinnvoll: eine grobe Schätzung der auf dem Wissen von typischen Plattformen auf Basis Kosten machen.

In this article, Tabelle 1 zeigt die Zeiten für typische primitive Operationen in .NET. Während Ihre Plattform variieren kann, ist die relative Zeit normalerweise sehr ähnlich. Vielleicht kannst du einen für iStuff finden oder sogar machen.

(ich habe nicht über eine so gründliche für andere Plattformen kommen, außer Prozessor/Befehlssatz Handbücher, aber sie beschäftigen sich mit Montageanleitung)

Speicherlokalizität:
Ein Cache-Miss können Sie kosten Hunderte von Zyklen, eine Festplatte Zugriff tausendmal so viel. Die Kontrolle Ihrer Speicherzugriffsmuster (d. H. Das Reduzieren des Arbeitssatzes, das Neustrukturieren und Zugreifen auf Daten auf eine Cache-freundliche Weise) ist daher ein wichtiger Teil der Bewertung eines Algorithmus.

+0

Danke. Das sind wirklich nützliche Informationen. Ich bin auch froh zu wissen, dass meine grundlegende Vorgehensweise nicht zu weit weg ist. – Rab

0

xCode verfügt über Instrumente, um die Leistung jeder Funktion/Operation zu messen, können Sie sie einfach verwenden.

+0

ich benutze sie. Aber die Anzahl der Tests, die ich machen müsste, um einen neuen Algorithmusentwurf zu informieren, könnte möglicherweise sehr groß sein. Exponentiell, quadratisch, logarithmisch groß. Deshalb würde ich gerne (zumindest) Richtlinien für die rechnerische Komplexität verschiedener Operationen finden. Mit anderen Worten, ich bin glücklich, das Handbuch zu lesen, aber ich möchte das Handbuch für eine ganze Sprache + Compiler + Architektur nicht schreiben. – Rab