1
hxgdzyuyi 2012-11-17 18:11:04 +08:00 1
time ?
|
3
VYSE 2012-11-17 18:46:26 +08:00
单条指令时间对程序有意义么?为什么不测试单个函数或模块的时间?
硬要测试的话只能在某些硬件某些环境下大量测试后去平均值,现在系统不是单任务,上下文一切换耗费的就不是一条指令时间,WINDOWS有GETTICKCOUNT调用,前后调用下,中间插汇编不断JMP BACK,忽视其开销 |
4
pythonee OP @VYSE 只是想知道一个大概范围,毕竟是学编程的,连这个问题不搞清楚,也挺说不过去的,另外,觉得这个问题有意思,不一定要说准确测出来,主要还是思路或可行的方法
|
5
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 |
6
NStal 2012-11-18 17:21:49 +08:00
我的思路是首先进入内核态确保单线程。我所做过的最简单的方法是直接把一块硬盘的MBR改写成自己的简单引导程序(用dd命令可以方便的达到这一点,记得备份)。之后用传统的跑n圈取平均值的方法就可以了。你可以事先在virtualbox的虚拟机里做尝试,当选择静态的虚拟硬盘是,MBR的在文件里的位置是固定的。直接把程序覆盖到那个启示位置就好。
|
7
linuz 2012-11-18 17:27:23 +08:00
机器码和汇编用时钟周期和指令周期就能计算出时间 ,高级语言的话不好计算
|
8
alexrezit 2012-11-18 18:33:48 +08:00
说真的, 现在的程序员很少有注意效率的. 你看 iTunes Store 上面的 app 那么好看, 谁知道背后代码什么样.
|
9
cyberscorpio 2012-11-18 18:39:51 +08:00
指令的执行时间 可以查阅 intel 的手册 (x86),上面每条指令需要几个周期都有说明。
硬盘上读取一个字节的时间,这个不一定,硬盘内部有缓存,OS 自身也有缓存,数据在不在缓存中,所需时间差异极大。如果是机械硬盘,数据和当前刺头的位置差异也是一个关键因素。 |
10
hanf 2012-11-19 16:14:38 +08:00
读处理器手册吧,不同的指令消耗不同的时钟周期,而时钟周期是可以从主频计算出来的
自己算 io的话,太多因素影响了,不好说 |
12
onesuper 2012-11-19 16:36:46 +08:00
自己写一个"benchmark"
写一个循环只有计算没有访存,数一下一个循环中的指令条数,算出总数然后除一下时间 如果想看访存指令就反过来。 硬件厂商会告诉你一些性能指标,比如每秒浮点运算的峰值,但是这个值只是参考,影响程序效率的因素太多了,数据的依赖性,数据在存储器山中的位置…… 但不同意你说的“程序员写程序之前必须了解电脑的一些参数”。 |
13
icoder 2012-11-19 16:48:27 +08:00
我都是加time
|
14
SkyFvcker 2012-11-19 17:49:54 +08:00
指令执行时间和程序性能的关系现在已经越来越淡了。
流水线,超流水(多发射),各种cache机制,超线程,以及分支预测等等技术让一段程序执行的时间变得非常不固定。比如如果有三个连续指令对同一个数据进行操作,那么执行的时间就远大于三个连续指令对不同的数据操作,因为对不同数据操作的指令可以被同时发射。 这还不谈各种IO对性能的影响。 总之,对于这种东西只要做数量级上的了解就可以了,比如IO操作>内存操作>CPU操作,浮点操作>乘法>加法=减法。 |
15
chisj 2012-11-19 18:39:42 +08:00
我觉得大部分可优化的地方根本不在指令,应该在业务代码。
|