31.5.4. 性能
|
31.5.4. 性能
既然我们已经看过了优化的实现机制,最好确信它真的值得花费这么多精力。为了演示优化的块拷贝版本和原来版本之间的性能差异,我这样设计测试程序:创建一个ACE_Message_Queue实例并向其中添加一些块,然后用std::copy()从一个char数组拷贝内容,再拷贝回另一个数组(还是用std::copy()),最后验证两个数组中的内容是一致的。块的数目从1到10都有,块的大小在10到10000之间。通过使用PlatformSTL的组件performance_counter,分别计算从源数组拷贝到序列,以及从序列拷贝到目标数组的时间。为了得到毫秒精度的测量值,每种拷贝操作重复20000次。本章在CD上的补充材料包含完整代码。
表31.1中是有代表性的测试结果,表示为相对于非优化版本运行时间(毫秒为单位)的百分比。不出所料,当块非常小时,差距可以忽略;将块的大小增长到100,优化版本胜出,但优势不大;然而,当把块的大小设为更有现实意义的1000和10000时,简直就不用再比了——优化版本领先幅度高达40到50倍。
表 31.1. 各种块拷贝的相对性能< xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> |
|
数组到迭代器 |
迭代器到数组 |
|
块数目 |
块大小 |
非优化版本 |
优化版本 |
% |
非优化版本 |
优化版本 |
% |
|
1 |
10 |
7 |
6 |
85.7% |
7 |
9 |
128.6% |
|
2 |
10 |
9 |
8 |
88.9% |
9 |
7 |
77.8% |
|
5 |
10 |
16 |
10 |
62.5% |
16 |
10 |
62.5% |
|
10 |
10 |
27 |
14 |
51.9% |
26 |
14 |
53.8% |
|
1 |
100 |
25 |
7 |
28.0% |
23 |
7 |
30.4% |
|
2 |
100 |
46 |
9 |
19.6% |
42 |
9 |
21.4% |
|
5 |
100 |
108 |
14 |
13.0% |
99 |
14 |
14.1% |
|
10 |
100 |
211 |
23 |
10.9% |
188 |
23 |
12.2% |
|
1 |
1,000 |
207 |
10 |
4.8% |
184 |
11 |
6.0% |
|
2 |
1,000 |
416 |
16 |
3.8% |
391 |
17 |
4.3% |
|
5 |
1,000 |
1,025 |
32 |
3.1% |
898 |
32 |
3.6% |
|
块数目 |
块大小 |
非优化版本 |
优化版本 |
% |
非优化版本 |
优化版本 |
% |
|
10 |
1,000 |
2,042 |
60 |
2.9% |
1,793 |
61 |
3.4% |
|
1 |
10,000 |
2,038 |
29 |
1.4% |
1,786 |
29 |
1.6% |
|
2 |
10,000 |
4,100 |
101 |
2.5% |
3,570 |
101 |
2.8% |
|
5 |
10,000 |
4,143 |
109 |
2.6% |
3,606 |
101 |
2.8% |
|
10 |
10,000 |
4,103 |
102 |
2.5% |
3,573 |
102 |
2.9% |
|