我需要提高以下代码的性能(Intel Ivy Bridge,x64):
unsigned int delta;
unsigned int a[100];
unsigned int b[100];
...
double sum = 0;
for(int i = 0; i < 100; i++)
sum += (double)b[i]/a[i];
bool possible = delta >= sum;
Run Code Online (Sandbox Code Playgroud)
瓶颈确实是double,并使执行时间增加3倍.a[index]将是从0到500米的任何东西.b[index]将从0到500.
问:在对这段代码的两次调用之间如何修改数组a和b?
在每次调用时,唯一的区别是a[index]++;,其中0 <= index < 100b为总是相同的.三角洲也不会改变.
由于结果与另一个数字进行比较并存储为布尔值,我绝对需要尽可能高的精度.这就是为什么我使用双倍而不是浮动的原因.如你所知,即使1/1b的差异也会返回错误的值,因为结果是布尔值!
有人可以提供C/C++定时器列表,它们提供了神级准确度吗?
例如,如果我使用100台计算机并在所有计算机中以相同的微秒启动程序,我希望计时器在连续运行一年后在所有计算机上显示相同的时间(具有不同的CPU和不同的CPU负载).
平台:Linux
精度:1秒但计时器必须是1秒,而不是1秒和1/1000000.额外的1/1000000是不可接受的.换句话说,在一年的运行中,甚至连一秒钟的精度都不可接受.
计时器不需要额外的硬件.
Q1:人类制作的最好的计时器是什么,它是免费的(计时,计时器,众多提升计时器之一,还是其他什么?)
Q2:使用这个最好的计时器,使用Ivy Bridge CPU时我可以期待什么样的准确度?
注意:我更喜欢C++(下面的代码是C++)但如果有人设法用任何通用语言执行以下操作,我很好.
这是一个想法:
a)计时器启动.
b)功能执行并且总是小于0.1秒.
c)程序休眠直到与开始的时间差恰好为0.1秒.
d)永远重复.
如果睡眠时间略高于0.1秒,比如0.105秒,我每秒失去0.005秒.这个不准确的成本在我的申请中,因为我在一天中失去了:0.005*3600*24 = 432秒.
我的申请是实时申请; 我失去的时间并不重要.
执行:
a)一步很简单,只需设置一个变量x = std::chrono::high_resolution_clock::now();
b)运行函数
c)
while((std::chrono::high_resolution_clock::now()-x).count() < 1000000)
std::this_thread::sleep_for(std::chrono::nanoseconds(1));
Run Code Online (Sandbox Code Playgroud)
d)只是循环
摘要:
a)我明白,无论如何,我每秒至少会损失1纳秒.
b)阅读完这些文章:第一,第二,我意识到,我的应用程序可能每秒丢失30微秒= 0.00003秒.这意味着,在一天中:0.00003*3600*24 =每天2.592秒.
c)目前使用上面描述的功能,我管理的每天最多损失7分钟.
我真正想做的事情:
我可以访问具有一个限制的服务器:每0.1秒只允许一个请求.如果它需要更少,他们将禁止我.如果我的请求需要更长时间,我下载的数据更少.我的应用程序每0.1秒下载一个文件.如果由于延迟我每天损失432秒,这意味着我可以更多地下载4320个文件.
问:如何在CentOS上实施CPU屏蔽,或其他任何操作系统?