Die Antworten erklären bisher nicht die volle Größe des Problems.
Wie spitztooth darauf hingewiesen hat, initialisiert die Paarlösung die Werte auf Null. Wie Lemurik darauf hingewiesen hat, initialisiert die Paarlösung nicht nur einen zusammenhängenden Speicherblock, sondern ruft den Paarkonstruktor für jedes Element in der Tabelle auf. Aber selbst das ist nicht dafür verantwortlich, dass es 1,5 Sekunden dauert. Etwas anderes passiert.
Hier ist meine Logik:
Angenommen, Sie auf einer alten Maschine waren, sagen wir bei 1,33 GHz läuft, dann 1,5 Sekunden ist 2E9 Taktzyklen. Sie haben 2e6 Paare zu konstruieren, also nimmt jeder Paarkonstruktor irgendwie 1000 Zyklen. Es dauert nicht 1000 Zyklen, um einen Konstruktor aufzurufen, der nur zwei ganze Zahlen auf Null setzt. Ich kann nicht sehen, wie Cache-Misses es so lange dauern würde. Ich würde es glauben, wenn die Anzahl weniger als 100 Zyklen wäre.
Ich dachte, es wäre interessant zu sehen, wo sonst alle diese CPU-Zyklen gehen. Ich benutzte den ältesten C++ - Compiler, den ich finden konnte, um zu sehen, ob ich die benötigte Verschwendung erreichen konnte. Dieser Compiler war VC++ v6. Im Debug-Modus macht es etwas, was ich nicht verstehe. Es hat eine große Schleife, die den Paarkonstruktor für jedes Element in der Tabelle aufruft - fair genug. Dieser Konstruktor setzt die beiden Werte auf Null - also gut genug. Aber bevor das getan wird, setzt es alle Bytes in einem 68-Byte-Bereich auf 0xcc. Diese Region ist kurz vor dem Beginn des großen Tischs. Dann überschreibt es das letzte Element dieser Region mit 0x28F61200. Jeder Aufruf des Paarkonstruktors wiederholt dies.Vermutlich ist dies eine Art Buchführung durch den Compiler, so dass er weiß, welche Bereiche initialisiert werden, wenn zur Laufzeit auf Zeigerfehler geprüft wird. Ich würde gerne genau wissen, wofür das ist.
Wie auch immer, das würde erklären, wo die zusätzliche Zeit läuft. Offensichtlich ist ein anderer Compiler möglicherweise nicht so schlecht. Und sicherlich wäre ein optimierter Release-Build nicht möglich.
Ich glaube, du meinst ACM ** ICPC **. –
Haben Sie dies mit aktivierten Optimierungen getestet? – jalf
Was ist die Leistung, wenn Sie einen 'no-arg'-Konstruktor zu' Cell' hinzufügen? – outis