0

我运行了我的应用程序两次(在 VS ide 中)。第一次用了 33 秒。我取消了 obj.save 的注释,它调用了很多代码并且花了 87 秒。那是一些缓慢的序列化代码!我怀疑有两个问题。首先是我做以下

template<class T> void Save_IntX(ostream& o, T v){ o.write((char*)&v,sizeof(T)); }

我把这个模板调用了几十万次(也许没那么多)。每个 .write() 是否使用可能会减慢速度的锁?也许我可以使用不需要锁定的内存蒸汽并转储它?我可以使用哪个不锁定的 ostream 并且可能取决于它仅在单个线程中使用?

另一个可疑的问题是我经常使用 dynamic_cast。但我不确定我是否可以解决这个问题。

这是将其转换为使用 fopen 而不是 ostream 后的快速分析会话。我想知道为什么我没有在这个列表中看到我的大部分函数,​​但正如你所看到的,write 仍然花费了最长的时间。注意:我只是意识到我的输出文件是半个演出。哎呀。也许这就是原因。

在此处输入图像描述

4

1 回答 1

1

我很高兴你明白了,但是下次你进行分析时,你可能需要考虑几点:

  • 采样模式下的 VS 分析器不会在 I/O 期间或任何其他程序阻塞时进行采样,因此它仅对 CPU 密集型分析非常有用。例如,如果它说例程包含 80% 的时间,但应用程序实际上只计算了 10% 的时间,那么 80% 实际上只有 8%。因此,对于任何非 CPU 绑定的工作,您需要使用分析器的检测模式。

  • 假设您这样做了,在所有这些数据列中,重要的是“包含百分比”,因为这是例程的真实成本,从某种意义上说,如果可以避免,那就是总时间将减少多少.

  • 在所有这些数据行中,可能重要的是包含您的例程的行,因为您的例程是唯一可以做任何事情的。如果您的代码是在没有调试信息的情况下编译的,那么看起来“未知帧”可能是您的代码。一般来说,使用调试信息进行概要分析是一个好主意,使其快速,然后删除调试信息。

于 2011-06-03T14:09:34.623 回答