Linux 实验作业,用普通函数和系统调用函数分别实现一个加法函数,分别运行几十万次记录总执行时间,
- 普通函数:661 msec
- 系统调用函数:2 usec
请问为什么内核态的代码执行效率更高?这里没有涉及到用户态与内核态切换
初学 Linux,也看了一些书和博客,知道是什么没搞明白为什么,有大佬能指点一下么?
你可以分别再试一下别的,比如文件操作
(f)open / f(read) / f(write)
大开多个 fd 和读写不同大小的文件
进程优先级不同吧,内核的优先级高点
代码写的有问题吧,性能哪能差这么多。
把你测试用的代码放出来啊
应该是用 c 测的吧 有时候你只要包含了头文件都会多很多系统调用 把代码放上来看
回复需要手机号验证,我在 github 上创建了一个 repo:github.com/Deardrops/system-program-lab2
源码已上传 github,楼上的链接里
应该测的是程序消耗的 CPU 时间。
无责任猜测,user mode 里的 printf 用到了 syscall,发生了用户态到内核态的切换。
期待有大佬能够解答
为什么一个是 c++ 代码,一个是 c 代码?把能控制的变量控制了,再进行比较啊(我也不知道 c, c++ 性能孰优孰劣,但使用相同的编译器是能让比较更有针对性的)。
个人觉得 verrickt 说的很有道理。printf 和 printk 的差别。
测试了下普通的,如果是编译的时候什么参数都不加是 300 多毫秒。加上-O3 就变成 0 毫秒了。看看是不是你的编译参数的问题。因为 operation 函数对 result 的操作,所有前面的都是没有意义的,只有最后一个有意义,那么编译器完全可以进行优化
自动优化这点以前没有想到,我按照这个思路再排查一下,谢谢你的建议
一般来说,各种语言的 print 性能损耗都挺大
仔细看下代码的话,其实普通函数版本在开始记时到结束记时的范围内,并没有 printf 语句哦。因此 printf 和 printk 函数并不是影响执行效率的主要原因。
什么代码?
我觉得 ftime 这个函数调用的时候也会发生系统调用,因为获取系统时钟应该是要访问内核的
兄弟获取时间不要 syscall,你确定么。。。
可能是两边优化程度不一样导致的。运行的正常分支走不到 print,获取时间单个函数的调用耗时很少,不会有那么大影响。
还有 printf 也比 printk 耗时多了
gcc O2 优化了
弱弱的问下,用户态默认是独占 cpu,不被调度吗
不用状态切换