Linux 实验作业,用普通函数和系统调用函数分别实现一个加法函数,分别运行几十万次记录总执行时间,
请问为什么内核态的代码执行效率更高?这里没有涉及到用户态与内核态切换
初学 Linux,也看了一些书和博客,知道是什么没搞明白为什么,有大佬能指点一下么?
1
tomychen 2019-06-03 15:00:46 +08:00
你可以分别再试一下别的,比如文件操作
(f)open / f(read) / f(write) 大开多个 fd 和读写不同大小的文件 |
2
lsp7572 2019-06-03 15:22:13 +08:00
进程优先级不同吧,内核的优先级高点
|
3
xupefei 2019-06-03 15:30:19 +08:00 via iPhone
代码写的有问题吧,性能哪能差这么多。
|
4
usingnamespace 2019-06-03 15:41:35 +08:00 via iPhone
把你测试用的代码放出来啊
应该是用 c 测的吧 有时候你只要包含了头文件都会多很多系统调用 把代码放上来看 |
5
Deardrops OP 回复需要手机号验证,我在 github 上创建了一个 repo:github.com/Deardrops/system-program-lab2
|
6
Deardrops OP @usingnamespace @xupefei 源码已上传 github,楼上的链接里
|
7
letianqiu 2019-06-03 17:24:51 +08:00
应该测的是程序消耗的 CPU 时间。
|
8
verrickt 2019-06-03 17:31:31 +08:00 via Android 1
无责任猜测,user mode 里的 printf 用到了 syscall,发生了用户态到内核态的切换。
|
9
misaka19000 2019-06-03 17:35:24 +08:00
期待有大佬能够解答
|
10
siteshen 2019-06-03 17:39:34 +08:00
为什么一个是 c++ 代码,一个是 c 代码?把能控制的变量控制了,再进行比较啊(我也不知道 c, c++ 性能孰优孰劣,但使用相同的编译器是能让比较更有针对性的)。
|
11
pinecone 2019-06-03 17:47:59 +08:00
个人觉得 verrickt 说的很有道理。printf 和 printk 的差别。
|
12
lff0305 2019-06-03 17:59:59 +08:00 1
测试了下普通的,如果是编译的时候什么参数都不加是 300 多毫秒。加上-O3 就变成 0 毫秒了。看看是不是你的编译参数的问题。因为 operation 函数对 result 的操作,所有前面的都是没有意义的,只有最后一个有意义,那么编译器完全可以进行优化
|
14
0ZXYDDu796nVCFxq 2019-06-03 18:17:40 +08:00 via Android
一般来说,各种语言的 print 性能损耗都挺大
|
15
Deardrops OP 仔细看下代码的话,其实普通函数版本在开始记时到结束记时的范围内,并没有 printf 语句哦。因此 printf 和 printk 函数并不是影响执行效率的主要原因。
|
16
glogo 2019-06-03 18:30:32 +08:00
什么代码?
|
17
yangzhezjgs 2019-06-03 18:33:12 +08:00
我觉得 ftime 这个函数调用的时候也会发生系统调用,因为获取系统时钟应该是要访问内核的
|
18
shylockhg 2019-06-03 18:49:26 +08:00
兄弟获取时间不要 syscall,你确定么。。。
|
19
goreliu 2019-06-03 18:54:08 +08:00 via Android
可能是两边优化程度不一样导致的。运行的正常分支走不到 print,获取时间单个函数的调用耗时很少,不会有那么大影响。
|
20
shylockhg 2019-06-03 18:55:37 +08:00
还有 printf 也比 printk 耗时多了
|
21
pymumu 2019-06-03 18:58:47 +08:00 via iPhone
gcc O2 优化了
|
22
smdbh 2019-06-03 21:15:21 +08:00 via iPhone
弱弱的问下,用户态默认是独占 cpu,不被调度吗
|
23
zwh2698 2019-06-03 23:32:43 +08:00 via Android
不用状态切换
|