请问程序输出到屏幕上的时间不占据程序运行的时间
占。
■网友
linux下可以用time命令看看
■网友
先说结论:占时间,而且还不少简单的说说自己的看法哈,如有错误欢迎指正,答主就不去说在哪个操作系统了,免得说错了,贻笑大方。在这里答主假设在一个答主做的新型32位操作系统中,执行这段代码(并且默认不支持VMX指令)。当一个printf发生时,可能会发生如下几个步骤:1. 内部实现函数会调用中断(IDTR寄存器设置),或者sysenter指令(msr寄存器设置),进入内核态。2.内核态代码通过句柄或者说是某个特殊的索引号在内存中搜索相关的图层结构,找到后,会根据相应的光标位置在指定的缓存画布位置持续按字节绘出对应编码的字符型。并在光标刷满时,负责把画布上移(可以认为内存大小位置均不变,丢弃最上一行数据,并把其他行上移一位)3.当绘制完成后,调用刷新函数对被露出的地方进行刷新,例如a窗口遮住了b窗口的左侧3/4 那么在屏幕上只会看到的右侧1/4,只需要刷新右侧1/4就可以了4.程序通过sysexit回到printf下一条指令。clock进入内核态只需要取一个由外部中断维护的数值即可,由此可以看出printf不仅占时间,而且占了很大一部分时间,当然,我觉得最占时间部分,应该是绘图和刷新的代码(计算以及寻址比较多)并且printf为了保持时效性,(反正)我会做成阻塞,不会放入内核的一个队伍中。多核情况下,可以用lock指令做个自旋锁(扯远了)胡说了一堆,可能说的不对,还望海涵……
■网友
其实这类问题,搞一些后台开发的也都常见,例如,某个功能的调试日志,抓包之类,以及常用的 print大法 进行调试等等,如果显示到屏幕上消耗的cpu资源太大,会影响现有业务。办法之一就是写到某个文件中,例如抓一段时间的数据包,写到文件中,全部包抓完后。在另外的窗口中打开文件显示和慢慢分析。办法之二就是代码支持远程telnet,直接打开远程抓包功能,抓一段时间的log包,直接在远程终端上显示。这种方式在一些嵌入式或者远程设备和数百cpu的通讯设备研发上有应用,调试各类接口协议和与其他人对接非常方便。我厂haisql_memcache 执行时,命令行附加 --debug_port=1972 ,可开启远程抓包模式,可以从远端telnet ip 1972, 支持help等一系列命令,可发命令抓取服务器端的收发包以及log日志等等远程debug功能。这些本身是良好设计的网络层的一个功能点,很多大公司的网络层库均内置此功能。下载测试 http://www.haisql.com
■网友
虽然不太清楚是受什么的限制。
但是解决方法很简单:
【请问程序输出到屏幕上的时间不占据程序运行的时间】 将输出全部用 sprint 输出到 buffer 中,然后 fwrite buffer 至 stdout 。(可以大幅解决输出时间问题)
■网友
占,而且不少请参考printf的实现
推荐阅读
- 招聘都要学历,何来程序员不看学历
- 银行系统的研发岗(程序员)是不是很难进(校招)推广到国企的研发岗(程序员)呢
- 银行高管的薪酬结构图表最新的,请问在哪里可以收集
- 在上海陆家嘴附近工作,请问去哪边租房会比较好
- 坐标合肥,请问在哪里能捕捉到程序员这种生物他们大都出现在哪里呢
- 程序猿和产品汪能愉快的一起谈恋爱嘛
- 怎样成为一名合格的Python程序员?
- 孕妇到了预产期,小孩还没有入盆,请问是该等下去还是直接剖腹产
- 我是程序猿养了条狗,取啥名字好
- 送程序员男友苹果无线耳机还是专业品牌耳机
