怎么知道一条指令的执行时间?

2012-11-17 18:09:03 +08:00
 pythonee
都说程序员写程序之前必须了解电脑的一些参数,比如指令的执行时间,从硬盘上读取一个字节的时间,从内存访问数据的时间,可能都说的不太准确,但是大家应该能体会我的意思,不知道大家平时是怎么做的
5182 次点击
所在节点    程序员
15 条回复
hxgdzyuyi
2012-11-17 18:11:04 +08:00
time ?
pythonee
2012-11-17 18:16:41 +08:00
@hxgdzyuyi 这个是测量整个程序的,我想知道一个指令
VYSE
2012-11-17 18:46:26 +08:00
单条指令时间对程序有意义么?为什么不测试单个函数或模块的时间?
硬要测试的话只能在某些硬件某些环境下大量测试后去平均值,现在系统不是单任务,上下文一切换耗费的就不是一条指令时间,WINDOWS有GETTICKCOUNT调用,前后调用下,中间插汇编不断JMP BACK,忽视其开销
pythonee
2012-11-17 20:04:06 +08:00
@VYSE 只是想知道一个大概范围,毕竟是学编程的,连这个问题不搞清楚,也挺说不过去的,另外,觉得这个问题有意思,不一定要说准确测出来,主要还是思路或可行的方法
VYSE
2012-11-17 20:27:01 +08:00
@pythonee 其实你的问题算是问指令周期。理想情况下各家CPU厂商有自己针对一种架构的指令消耗时钟周期说明手册
附一个INTEL的:
http://www.intel.com/content/www/us/en/architecture-and-technology/64-ia-32-architectures-optimization-manual.html
NStal
2012-11-18 17:21:49 +08:00
我的思路是首先进入内核态确保单线程。我所做过的最简单的方法是直接把一块硬盘的MBR改写成自己的简单引导程序(用dd命令可以方便的达到这一点,记得备份)。之后用传统的跑n圈取平均值的方法就可以了。你可以事先在virtualbox的虚拟机里做尝试,当选择静态的虚拟硬盘是,MBR的在文件里的位置是固定的。直接把程序覆盖到那个启示位置就好。
linuz
2012-11-18 17:27:23 +08:00
机器码和汇编用时钟周期和指令周期就能计算出时间 ,高级语言的话不好计算
alexrezit
2012-11-18 18:33:48 +08:00
说真的, 现在的程序员很少有注意效率的. 你看 iTunes Store 上面的 app 那么好看, 谁知道背后代码什么样.
cyberscorpio
2012-11-18 18:39:51 +08:00
指令的执行时间 可以查阅 intel 的手册 (x86),上面每条指令需要几个周期都有说明。
硬盘上读取一个字节的时间,这个不一定,硬盘内部有缓存,OS 自身也有缓存,数据在不在缓存中,所需时间差异极大。如果是机械硬盘,数据和当前刺头的位置差异也是一个关键因素。
hanf
2012-11-19 16:14:38 +08:00
读处理器手册吧,不同的指令消耗不同的时钟周期,而时钟周期是可以从主频计算出来的
自己算
io的话,太多因素影响了,不好说
reus
2012-11-19 16:24:35 +08:00
@alexrezit 那也得看什么样的程序员,做的哪类开发,不可一概而论
onesuper
2012-11-19 16:36:46 +08:00
自己写一个"benchmark"

写一个循环只有计算没有访存,数一下一个循环中的指令条数,算出总数然后除一下时间

如果想看访存指令就反过来。

硬件厂商会告诉你一些性能指标,比如每秒浮点运算的峰值,但是这个值只是参考,影响程序效率的因素太多了,数据的依赖性,数据在存储器山中的位置……

但不同意你说的“程序员写程序之前必须了解电脑的一些参数”。
icoder
2012-11-19 16:48:27 +08:00
我都是加time
SkyFvcker
2012-11-19 17:49:54 +08:00
指令执行时间和程序性能的关系现在已经越来越淡了。
流水线,超流水(多发射),各种cache机制,超线程,以及分支预测等等技术让一段程序执行的时间变得非常不固定。比如如果有三个连续指令对同一个数据进行操作,那么执行的时间就远大于三个连续指令对不同的数据操作,因为对不同数据操作的指令可以被同时发射。
这还不谈各种IO对性能的影响。
总之,对于这种东西只要做数量级上的了解就可以了,比如IO操作>内存操作>CPU操作,浮点操作>乘法>加法=减法。
chisj
2012-11-19 18:39:42 +08:00
我觉得大部分可优化的地方根本不在指令,应该在业务代码。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/52622

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX