到目前为止的答案并没有解释问题的全部重要性。
正如锐利指出的那样,这对解决方案将这些值初始化为零。正如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