- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在测试通过指针测量一个函数调用的成本,这是我的 code .但是,我发现了一些非常奇怪的事情并寻求您的帮助。
代码在VS2017的Release模式下编译,使用默认配置。
有 4 个测试平台,它们的所有操作系统都是 Win10。以下是一些详细信息:
machine parameter_order alias
.
machine
上面列出了。
parameter_order
描述
LOOP
的顺序在单次运行期间传递给程序。
alias
指示时间是哪个部分。
no-exec
也就是没有函数调用部分。第 98-108 行。
exec
表示调用函数部分,又名。第 115-125 行。
per-exec
是函数调用的成本。所有时间单位都是毫秒。
per-exec
指左 y 轴,而其他指右 y 轴。
LOOP < 25
和 LOOP > 100
)? 32 <= LOOP <= 41
时所有的非执行时间都有一个奇怪的峰值? 72 <= LOOP <= 94
时 Kaby Lake 机器(M1 和 M2)的 no-exec 时间和 exec 时间有不连续的间隔? #include <cstdio>
#include <cstdlib>
#include <ctime>
#include <cassert>
#include <algorithm>
#include <windows.h>
using namespace std;
const int PMAX = 11000000, ITER = 60000, RULE = 10000;
//const int LOOP = 10;
int func1(int a, int b, int c, int d, int e)
{
return 0;
}
int func2(int a, int b, int c, int d, int e)
{
return 0;
}
int func3(int a, int b, int c, int d, int e)
{
return 0;
}
int func4(int a, int b, int c, int d, int e)
{
return 0;
}
int func5(int a, int b, int c, int d, int e)
{
return 0;
}
int func6(int a, int b, int c, int d, int e)
{
return 0;
}
int (*init[6])(int, int, int, int, int) = {
func1,
func2,
func3,
func4,
func5,
func6
};
int (*pool[PMAX])(int, int, int, int, int);
LARGE_INTEGER freq;
void getTime(LARGE_INTEGER *res)
{
QueryPerformanceCounter(res);
}
double delta(LARGE_INTEGER begin_time, LARGE_INTEGER end_time)
{
return (end_time.QuadPart - begin_time.QuadPart) * 1000.0 / freq.QuadPart;
}
int main()
{
char path[100], tmp[100];
FILE *fin, *fout;
int cnt = 0;
int i, j, t, r;
int ans;
int LOOP;
LARGE_INTEGER begin_time, end_time;
double d1, d2, res;
for(i = 0;i < PMAX;i += 1)
pool[i] = init[i % 6];
QueryPerformanceFrequency(&freq);
printf("file path:");
scanf("%s", path);
fin = fopen(path, "r");
start:
if (fscanf(fin, "%d", &LOOP) == EOF)
goto end;
ans = 0;
getTime(&begin_time);
for(r = 0;r < RULE;r += 1)
{
for(t = 0;t < ITER;t += 1)
{
//ans ^= (pool[t])(0, 0, 0, 0, 0);
ans ^= pool[0](0, 0, 0, 0, 0);
ans = 0;
for(j = 0;j < LOOP;j += 1)
ans ^= j;
}
}
getTime(&end_time);
printf("%.10f\n", d1 = delta(begin_time, end_time));
printf("ans:%d\n", ans);
ans = 0;
getTime(&begin_time);
for(r = 0;r < RULE;r += 1)
{
for(t = 0;t < ITER;t += 1)
{
ans ^= (pool[t])(0, 0, 0, 0, 0);
ans ^= pool[0](0, 0, 0, 0, 0);
ans = 0;
for(j = 0;j < LOOP;j += 1)
ans ^= j;
}
}
getTime(&end_time);
printf("%.10f\n", d2 = delta(begin_time, end_time));
printf("ans:%d\n", ans);
printf("%.10f\n", res = (d2 - d1) / (1.0 * RULE * ITER));
sprintf(tmp, "%d.txt", cnt++);
fout = fopen(tmp, "w");
fprintf(fout, "%d,%.10f,%.10f,%.10f\n", LOOP, d1, d2, res);
fclose(fout);
goto start;
end:
fclose(fin);
system("pause");
exit(0);
}
最佳答案
Why do all machines have two stage (LOOP < 25 and LOOP > 100)?
for(j = 0;j < LOOP;j += 1)
时。 ,停止正确预测其退出。在我的机器上它发生在
LOOP
达到 24 次迭代。
perf stat -I3000
看得很清楚。将基准输出与性能统计信息交错:
BenchWithFixture/RandomTarget/21 727779 ns 727224 ns 3851 78.6834M items/s
45.003283831 2998.636997 task-clock (msec)
45.003283831 118 context-switches # 0.039 K/sec
45.003283831 0 cpu-migrations # 0.000 K/sec
45.003283831 0 page-faults # 0.000 K/sec
45.003283831 7,777,209,518 cycles # 2.595 GHz
45.003283831 26,846,680,371 instructions # 3.45 insn per cycle
45.003283831 6,711,087,432 branches # 2238.882 M/sec
45.003283831 1,962,643 branch-misses # 0.03% of all branches
BenchWithFixture/RandomTarget/22 751421 ns 750758 ns 3731 76.2169M items/s
48.003487573 2998.943341 task-clock (msec)
48.003487573 111 context-switches # 0.037 K/sec
48.003487573 0 cpu-migrations # 0.000 K/sec
48.003487573 0 page-faults # 0.000 K/sec
48.003487573 7,778,285,186 cycles # 2.595 GHz
48.003487573 26,956,175,646 instructions # 3.47 insn per cycle
48.003487573 6,738,461,171 branches # 2247.947 M/sec
48.003487573 1,973,024 branch-misses # 0.03% of all branches
BenchWithFixture/RandomTarget/23 774490 ns 773955 ns 3620 73.9325M items/s
51.003697814 2999.024360 task-clock (msec)
51.003697814 105 context-switches # 0.035 K/sec
51.003697814 0 cpu-migrations # 0.000 K/sec
51.003697814 0 page-faults # 0.000 K/sec
51.003697814 7,778,570,598 cycles # 2.595 GHz
51.003697814 21,547,027,451 instructions # 2.77 insn per cycle
51.003697814 5,386,175,806 branches # 1796.776 M/sec
51.003697814 72,207,066 branch-misses # 1.12% of all branches
BenchWithFixture/RandomTarget/24 1138919 ns 1138088 ns 2461 50.2777M items/s
57.004129981 2999.003582 task-clock (msec)
57.004129981 108 context-switches # 0.036 K/sec
57.004129981 0 cpu-migrations # 0.000 K/sec
57.004129981 0 page-faults # 0.000 K/sec
57.004129981 7,778,509,575 cycles # 2.595 GHz
57.004129981 19,061,717,197 instructions # 2.45 insn per cycle
57.004129981 4,765,017,648 branches # 1589.492 M/sec
57.004129981 103,398,285 branch-misses # 1.65% of all branches
BenchWithFixture/RandomTarget/25 1171572 ns 1170748 ns 2391 48.8751M items/s
60.004325775 2998.547350 task-clock (msec)
60.004325775 111 context-switches # 0.037 K/sec
60.004325775 0 cpu-migrations # 0.000 K/sec
60.004325775 0 page-faults # 0.000 K/sec
60.004325775 7,777,298,382 cycles # 2.594 GHz
60.004325775 17,008,954,992 instructions # 2.19 insn per cycle
60.004325775 4,251,656,734 branches # 1418.230 M/sec
60.004325775 131,311,948 branch-misses # 2.13% of all branches
1 / 25 == 4%
左右。错误预测,但我们没有看到,不知道为什么。
pool[0](0,0,0,0,0)
调用)和你的一样,在 ~24
LOOP
处没有转换。迭代,但为什么我不清楚。我的经验是,TAGE 计数器通常无法处理超过 24 个周期的恒定迭代循环,但这里可能与间接分支预测器有一些交互。这很有趣。
Why do all no-exec time have a weird peak when 32 <= LOOP <= 41?
Why do no-exec time and exec time of Kaby Lake machines (M1 and M2) have a discontinuous interval when 72 <= LOOP <= 94?
Why does M4 (Server processor) have a larger variance compared to M3 (Desktop processor)?
关于x86 - 与 CPU 微架构相关的奇怪现象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50492071/
问题故障解决记录 -- Java RMI Connection refused to host: x.x.x.x .... 在学习JavaRMI时,我遇到了以下情况 问题原因:可
我正在玩 Rank-N-type 并尝试输入 x x .但我发现这两个函数可以以相同的方式输入,这很不直观。 f :: (forall a b. a -> b) -> c f x = x x g ::
这个问题已经有答案了: How do you compare two version Strings in Java? (31 个回答) 已关闭 8 年前。 有谁知道如何在Java中比较两个版本字符串
这个问题已经有答案了: How do the post increment (i++) and pre increment (++i) operators work in Java? (14 个回答)
下面是带有 -n 和 -r 选项的 netstat 命令的输出,其中目标字段显示压缩地址 (127.1/16)。我想知道 netstat 命令是否有任何方法或选项可以显示整个目标 IP (127.1.
我知道要证明 : (¬ ∀ x, p x) → (∃ x, ¬ p x) 证明是: theorem : (¬ ∀ x, p x) → (∃ x, ¬ p x) := begin intro n
x * x 如何通过将其存储在“auto 变量”中来更改?我认为它应该仍然是相同的,并且我的测试表明类型、大小和值显然都是相同的。 但即使 x * x == (xx = x * x) 也是错误的。什么
假设,我们这样表达: someIQueryable.Where(x => x.SomeBoolProperty) someIQueryable.Where(x => !x.SomeBoolProper
我有一个字符串 1234X5678 我使用这个正则表达式来匹配模式 .X|..X|X. 我得到了 34X 问题是为什么我没有得到 4X 或 X5? 为什么正则表达式选择执行第二种模式? 最佳答案 这里
我的一个 friend 在面试时遇到了这个问题 找到使该函数返回真值的 x 值 function f(x) { return (x++ !== x) && (x++ === x); } 面试官
这个问题在这里已经有了答案: 10年前关闭。 Possible Duplicate: Isn't it easier to work with foo when it is represented b
我是 android 的新手,我一直在练习开发一个针对 2.2 版本的应用程序,我需要帮助了解如何将我的应用程序扩展到其他版本,即 1.x、2.3.x、3 .x 和 4.x.x,以及一些针对屏幕分辨率
为什么案例 1 给我们 :error: TypeError: x is undefined on line... //case 1 var x; x.push(x); console.log(x);
代码优先: # CASE 01 def test1(x): x += x print x l = [100] test1(l) print l CASE01 输出: [100, 100
我正在努力温习我的大计算。如果我有将所有项目移至 'i' 2 个空格右侧的函数,我有一个如下所示的公式: (n -1) + (n - 2) + (n - 3) ... (n - n) 第一次迭代我必须
给定 IP 字符串(如 x.x.x.x/x),我如何或将如何计算 IP 的范围最常见的情况可能是 198.162.1.1/24但可以是任何东西,因为法律允许的任何东西。 我要带198.162.1.1/
在我作为初学者努力编写干净的 Javascript 代码时,我最近阅读了 this article当我偶然发现这一段时,关于 JavaScript 中的命名空间: The code at the ve
我正在编写一个脚本,我希望避免污染 DOM 的其余部分,它将是一个用于收集一些基本访问者分析数据的第 3 方脚本。 我通常使用以下内容创建一个伪“命名空间”: var x = x || {}; 我正在
我尝试运行我的test_container_services.py套件,但遇到了以下问题: docker.errors.APIError:500服务器错误:内部服务器错误(“ b'{” message
是否存在这两个 if 语句会产生不同结果的情况? if(x as X != null) { // Do something } if(x is X) { // Do something } 编
我是一名优秀的程序员,十分优秀!