如何解决我的程序会产生许多页面错误当输入数据大小增加 1 时,缺页次数减少到 1/10什么可能导致这种情况?
我编写了一个程序来测试排序合并的性能。该程序只是从两个相同大小的数组中读取条目,对条目的键进行排序合并,然后将结果写入一个新数组。每个条目占用 140 个字节。第一个数组的键为偶数 0,2,4,6....,第二个数组的键为奇数 1,3,5,7... 所以合并后的数组包含来自输入的所有条目.
我使用谷歌基准来收集数据。
当我将输入数组大小设置为 32410 时,该过程需要 14429772 ns。当我将输入数组大小增加 1 至 32411 时,总运行时间减少一半至 6862094 ns。这个观察结果可以稳定重现。
我试图找出原因,perf stat
给了我以下结果。我看到输入较小的那个会产生 10 倍多的页面错误,并且在 sys cpu 时间上花费了一半时间。我认为页面错误是导致输入较小的程序变慢的根本原因。但我不明白为什么。
cpu 为 Intel(R) Xeon(R) Gold 6126 cpu @ 2.60GHz,操作系统为 Ubuntu 20.04。
谁能提供一些提示?谢谢!
输入大小为 32410
Performance counter stats for './vert_block_merge_benchmark':
916.54 msec task-clock # 0.981 cpus utilized
2 context-switches # 0.002 K/sec
0 cpu-migrations # 0.000 K/sec
275135 page-faults # 0.300 M/sec
^^^^^^^^^^^^^^^^^^^^^^^
3293532138 cycles # 3.593 GHz
4520763031 instructions # 1.37 insn per cycle
1019018940 branches # 1111.815 M/sec
2147399 branch-misses # 0.21% of all branches
0.934126606 seconds time elapsed
0.494751000 seconds user
0.422348000 seconds sys
^^^^^^^^^^^^^^
输入大小为 32411
Performance counter stats for './vert_block_merge_benchmark':
835.87 msec task-clock # 0.980 cpus utilized
2 context-switches # 0.002 K/sec
0 cpu-migrations # 0.000 K/sec
21868 page-faults # 0.026 M/sec
^^^^^^^^^^^^^^^^^
2983972313 cycles # 3.570 GHz
6322080505 instructions # 2.12 insn per cycle
1508755500 branches # 1805.002 M/sec
2364763 branch-misses # 0.16% of all branches
0.853299790 seconds time elapsed
0.792227000 seconds user
0.044236000 seconds sys
^^^^^^^^^^^^^^^^^^^^
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。