V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
pythonee
V2EX  ›  程序员

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

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

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

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

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

    但不同意你说的“程序员写程序之前必须了解电脑的一些参数”。
    icoder
        13
    icoder  
       2012-11-19 16:48:27 +08:00
    我都是加time
    SkyFvcker
        14
    SkyFvcker  
       2012-11-19 17:49:54 +08:00
    指令执行时间和程序性能的关系现在已经越来越淡了。
    流水线,超流水(多发射),各种cache机制,超线程,以及分支预测等等技术让一段程序执行的时间变得非常不固定。比如如果有三个连续指令对同一个数据进行操作,那么执行的时间就远大于三个连续指令对不同的数据操作,因为对不同数据操作的指令可以被同时发射。
    这还不谈各种IO对性能的影响。
    总之,对于这种东西只要做数量级上的了解就可以了,比如IO操作>内存操作>CPU操作,浮点操作>乘法>加法=减法。
    chisj
        15
    chisj  
       2012-11-19 18:39:42 +08:00
    我觉得大部分可优化的地方根本不在指令,应该在业务代码。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2626 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 09:50 · PVG 17:50 · LAX 01:50 · JFK 04:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.