给定一个在[0,1]范围内的实数X,在一个特定的bin之后,我必须确定X落在哪个bin中。给定箱子大小dx,我使用i = std::size_t(X/dx)
,它工作得很好。然后我查找给定数组v的相应值,并使用double Y=v[i]
设置第二个变量Y。整个代码如下所示:
double X = func();
dx=0.01;
int i = std::size_t(X/dx);
double Y = v[i];
print(Y)
该方法正确地给出了索引i在[0,length(v)]范围内的期望值。
我的主要问题不是找到索引,而是使用它:X
是从辅助函数确定的,每当我需要使用上面确定的索引设置Y=v[i]
时,代码就变得非常慢。在不注释或删除任何行的情况下,在定义之后将X设置为0到1之间的随机值,或者在第三行之后将i设置为0到v长度之间的随机值,代码会变得快得多。
有人能告诉我为什么会这样吗?速度变化了1000倍,如果不是更多的话,因为在更快的方法中只有额外的步骤,而且func()
无论如何都被调用,我不明白为什么它应该变得更快。
由于您没有在问题中放入代码,因此必须像这样进行胡乱猜测:
-
在访问查找表之前没有对所有X结果进行排序。
-
X的一些值是非规格化的,这对某些CPU类型(包括您的CPU)的计算时间造成了影响。
-
数据集对于L3缓存来说太大了,它总是访问RAM,而不是在其他测试中看到的快速缓存命中。
-
编译器正在优化所有昂贵的函数调用,但在实际测试场景中,它不是。
-
时间测量有bug
-
计算机性能不稳定(如作为共享服务器或防病毒干预消耗RAM带宽)