我有个问题....
我在while循环中将数据写入数组。关键是我真的经常这样做。看来这本书现在已成为代码中的瓶颈。因此,我想这是由于写入内存引起的。这个数组不是真的很大(大概300个元素)。问题是有可能以这种方式做到这一点:将其存储在高速缓存中并仅在while循环完成之后才在内存中进行更新吗?
[编辑-从亚历克斯添加的答案中复制]
double* array1 = new double[1000000]; // this array has elements
unsigned long* array2 = unsigned long[300];
double varX,t,sum=0;
int iter=0,i=0;
while(i<=max_steps)
{
varX+=difX;
nm0 = int(varX);
if(nm1!=nm0)
{
array2[iter] = nm0; // if you comment this string application works more then 2 times faster :)
nm1=nm0;
t = array1[nm0]; // if you comment this string , there is almost no change in time
++iter;
}
sum+=t;
++i;
}
首先,我要感谢大家的回答。确实,不放置代码有点愚蠢。所以我决定现在就做。
double* array1 = new double[1000000]; // this array has elements
unsigned long* array2 = unsigned long[300];
double varX,t,sum=0;
int iter=0,i=0;
while(i<=max_steps)
{
varX+=difX;
nm0 = int(varX);
if(nm1!=nm0)
{
array2[iter] = nm0; // if you comment this string application works more then 2 times faster :)
nm1=nm0;
t = array1[nm0]; // if you comment this string , there is almost no change in time
++iter;
}
sum+=t;
++i;
}
就这样。如果有人有任何想法,那就太好了。再一次非常感谢你。
真挚地
亚历克斯
最佳答案
不是故意的,不。除其他事项外,您不知道缓存有多大,因此您不知道将要容纳什么。此外,如果允许该应用程序锁定部分缓存,则对OS的影响可能会破坏整个系统的性能。这正好落在我的 list 上“您不能这样做,因为您不应该这样做。
您可以做的是改善引用的局部性-尝试安排循环,以使您不会多次访问元素,并尝试按顺序访问内存中的元素。
如果没有有关您的应用程序的更多线索,我认为无法给出更具体的建议。