为什么同一段代码在 Linux 内核态比用户态执行的效率高?

2019-06-03 14:45:49 +08:00
 Deardrops

Linux 实验作业,用普通函数和系统调用函数分别实现一个加法函数,分别运行几十万次记录总执行时间,

请问为什么内核态的代码执行效率更高?这里没有涉及到用户态与内核态切换

初学 Linux,也看了一些书和博客,知道是什么没搞明白为什么,有大佬能指点一下么?

6470 次点击
所在节点    Linux
23 条回复
tomychen
2019-06-03 15:00:46 +08:00
你可以分别再试一下别的,比如文件操作

(f)open / f(read) / f(write)

大开多个 fd 和读写不同大小的文件
lsp7572
2019-06-03 15:22:13 +08:00
进程优先级不同吧,内核的优先级高点
xupefei
2019-06-03 15:30:19 +08:00
代码写的有问题吧,性能哪能差这么多。
usingnamespace
2019-06-03 15:41:35 +08:00
把你测试用的代码放出来啊
应该是用 c 测的吧 有时候你只要包含了头文件都会多很多系统调用 把代码放上来看
Deardrops
2019-06-03 16:56:12 +08:00
回复需要手机号验证,我在 github 上创建了一个 repo:github.com/Deardrops/system-program-lab2
Deardrops
2019-06-03 16:57:45 +08:00
@usingnamespace @xupefei 源码已上传 github,楼上的链接里
letianqiu
2019-06-03 17:24:51 +08:00
应该测的是程序消耗的 CPU 时间。
verrickt
2019-06-03 17:31:31 +08:00
无责任猜测,user mode 里的 printf 用到了 syscall,发生了用户态到内核态的切换。
misaka19000
2019-06-03 17:35:24 +08:00
期待有大佬能够解答
siteshen
2019-06-03 17:39:34 +08:00
为什么一个是 c++ 代码,一个是 c 代码?把能控制的变量控制了,再进行比较啊(我也不知道 c, c++ 性能孰优孰劣,但使用相同的编译器是能让比较更有针对性的)。
pinecone
2019-06-03 17:47:59 +08:00
个人觉得 verrickt 说的很有道理。printf 和 printk 的差别。
lff0305
2019-06-03 17:59:59 +08:00
测试了下普通的,如果是编译的时候什么参数都不加是 300 多毫秒。加上-O3 就变成 0 毫秒了。看看是不是你的编译参数的问题。因为 operation 函数对 result 的操作,所有前面的都是没有意义的,只有最后一个有意义,那么编译器完全可以进行优化
Deardrops
2019-06-03 18:11:01 +08:00
@lff0305 自动优化这点以前没有想到,我按照这个思路再排查一下,谢谢你的建议
gstqc
2019-06-03 18:17:40 +08:00
一般来说,各种语言的 print 性能损耗都挺大
Deardrops
2019-06-03 18:24:33 +08:00
仔细看下代码的话,其实普通函数版本在开始记时到结束记时的范围内,并没有 printf 语句哦。因此 printf 和 printk 函数并不是影响执行效率的主要原因。
glogo
2019-06-03 18:30:32 +08:00
什么代码?
yangzhezjgs
2019-06-03 18:33:12 +08:00
我觉得 ftime 这个函数调用的时候也会发生系统调用,因为获取系统时钟应该是要访问内核的
shylockhg
2019-06-03 18:49:26 +08:00
兄弟获取时间不要 syscall,你确定么。。。
goreliu
2019-06-03 18:54:08 +08:00
可能是两边优化程度不一样导致的。运行的正常分支走不到 print,获取时间单个函数的调用耗时很少,不会有那么大影响。
shylockhg
2019-06-03 18:55:37 +08:00
还有 printf 也比 printk 耗时多了

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

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

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

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

© 2021 V2EX