首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取cpu频率(每秒的周期数)-3种不同的方式:

获取cpu频率(每秒的周期数)-3种不同的方式:
EN

Stack Overflow用户
提问于 2012-01-16 23:29:04
回答 3查看 2.9K关注 0票数 3

我有三种计算方法来获得当前的cpu频率:(每秒的周期数)

代码语言:javascript
复制
_initialCycles  = rdtsc(); //rdtsc function calculates the cpu cycles since init.


first:
------
unsigned int initialMillisec = (_timeVal.tv_sec)*1000+(_timeVal.tv_usec)/1000;
unsigned int cps1 = ((_initialCycles / initialMillisec) * 1000);

second:
-------
double initialMillisec2 = (_timeVal.tv_sec)*1000+(_timeVal.tv_usec)/1000.0;
unsigned int cps2 = (unsigned int)(_initialCycles / initialMillisec2 * 1000.0);

third:
------
unsigned long long initialUsec3 = 
                ((unsigned long long)(_timeVal.tv_sec))*1000000+_timeVal.tv_usec) ;
unsigned int cps3 = (unsigned int)((_initialCycles / initialUsec3)* 1000000.0);

问题是,cps1 cps2 cps3假设有相同的值,或多或少..但他们不会。我明白:

代码语言:javascript
复制
cps1 = 2824048000
cps2 = 3824609671
cps3 = 8000000

有人知道为什么吗?

EN

回答 3

Stack Overflow用户

发布于 2012-01-16 23:49:30

整数类型的问题在于四舍五入。当你被某个大数字除以时,你丢失了有效数字。因此,您应该更改乘法和除法之间的操作顺序。首先,你应该乘以1,000(或者在long long的情况下是1000000 ),然后再除法。

以下是一些整数精度下降的例子:

321 / 20 * 20 = 320;

321 / 75 * 75 = 300;

321 / 112 * 112 = 224

票数 5
EN

Stack Overflow用户

发布于 2012-01-16 23:47:31

同时还有许多其他线程和进程在运行,OS调度程序可能会对这种测量频率的方法感到恐惧。

尝试使用"cpufreq“实用程序来准确地获取当前的时钟速度。

票数 2
EN

Stack Overflow用户

发布于 2012-01-16 23:47:03

运算符优先级和隐式转换。

当然,您需要确保运算符按照您希望的顺序进行计算。我最好的建议是:如果你需要三思而后行才能知道没有括号的顺序,那就加上括号。

然后:你需要提前将整数转换成浮点数,否则你最终会得到整数除法和同样的舍入误差。

代码语言:javascript
复制
unsigned int initialMillisec = _timeVal.tv_sec*1000 + _timeVal.tv_usec/1000;
unsigned int cps1 = (1.0 * _initialCycles / initialMillisec) * 1000.0;

将是我的建议

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8882183

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档