到目前爲止的答案並沒有解釋問題的全部重要性。
正如銳利指出的那樣,這對解決方案將這些值初始化爲零。正如Lemurik指出的那樣,這對解決方案不僅僅是初始化一個連續的內存塊,而是調用表中每個元素的pair構造函數。但是,即使這也不佔用1.5秒的時間。其他事情正在發生。
這裏是我的邏輯:
假設你是一個古老的機器上,說爲1.33GHz運行,然後加入1.5秒2E9個時鐘週期。你有2e6對構造,所以每對構造函數都花費1000個週期。 調用只將兩個整數設置爲零的構造函數不需要1000個週期。我無法看到緩存未命中如何會花費那麼長時間。如果數量少於100個週期,我會相信它。
我認爲看看所有這些CPU週期還有哪些地方會很有趣。我用我能找到的最古老的C++編譯器來查看是否可以達到所需的浪費水平。該編譯器是VC++ v6。在調試模式下,它做了一些我不明白的事情。它有一個很大的循環,爲表中的每個項目調用pair構造函數 - 足夠公平。該構造函數將這兩個值設置爲零 - 夠公平的。但在這之前,它將68字節區域中的所有字節設置爲0xcc。該區域就在大桌子開始之前。然後用0x28F61200覆蓋該區域的最後一個元素。對構造函數的每次調用重複此操作。據推測,這是某種由編譯器保留的書籍,因此它知道在運行時檢查指針錯誤時哪些區域被初始化。我很想知道這是什麼。
無論如何,這將解釋額外時間的去向。很明顯,另一個編譯器可能不會這麼糟糕。當然,優化的發佈版本不會。
我相信你的意思是ACM ** ICPC **。 – 2009-10-22 12:52:44
您是否已啓用優化來測試此功能? – jalf 2009-10-24 08:45:03
如果向'Cell'添加無參數構造函數,性能如何? – outis 2009-10-24 08:46:22