Distributions
› Ubuntu
› Fedora
› CentOS
中文资源站
› 网易开源镜像站
Deardrops
V2EX  ›  Linux

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

  •  1
     
  •   Deardrops ·
    deardrops · Jun 3, 2019 · 8033 views
    This topic created in 2709 days ago, the information mentioned may be changed or developed.

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

    • 普通函数:661 msec
    • 系统调用函数:2 usec

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

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

    23 replies  •  2019-06-03 23:32:43 +08:00
    tomychen
    tomychen
    Jun 3, 2019
    1
    你可以分别再试一下别的,比如文件操作

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

    大开多个 fd 和读写不同大小的文件
    lsp7572
    lsp7572
    Jun 3, 2019
    2
    进程优先级不同吧,内核的优先级高点
    xupefei
    xupefei
    Jun 3, 2019 via iPhone
    3
    代码写的有问题吧,性能哪能差这么多。
    usingnamespace
    usingnamespace
    Jun 3, 2019 via iPhone
    4
    把你测试用的代码放出来啊
    应该是用 c 测的吧 有时候你只要包含了头文件都会多很多系统调用 把代码放上来看
    Deardrops
    Deardrops
    OP
    Jun 3, 2019
    5
    回复需要手机号验证,我在 github 上创建了一个 repo:github.com/Deardrops/system-program-lab2
    Deardrops
    Deardrops
    OP
    Jun 3, 2019
    6
    @usingnamespace @xupefei 源码已上传 github,楼上的链接里
    letianqiu
    letianqiu
    Jun 3, 2019
    7
    应该测的是程序消耗的 CPU 时间。
    KasaneTeto
    KasaneTeto
    Jun 3, 2019 via Android❤️1
    8
    无责任猜测,user mode 里的 printf 用到了 syscall,发生了用户态到内核态的切换。
    misaka19000
    misaka19000
    Jun 3, 2019
    9
    期待有大佬能够解答
    siteshen
    siteshen
    Jun 3, 2019
    10
    为什么一个是 c++ 代码,一个是 c 代码?把能控制的变量控制了,再进行比较啊(我也不知道 c, c++ 性能孰优孰劣,但使用相同的编译器是能让比较更有针对性的)。
    pinecone
    pinecone
    Jun 3, 2019
    11
    个人觉得 verrickt 说的很有道理。printf 和 printk 的差别。
    lff0305
    lff0305
    Jun 3, 2019❤️1
    12
    测试了下普通的,如果是编译的时候什么参数都不加是 300 多毫秒。加上-O3 就变成 0 毫秒了。看看是不是你的编译参数的问题。因为 operation 函数对 result 的操作,所有前面的都是没有意义的,只有最后一个有意义,那么编译器完全可以进行优化
    Deardrops
    Deardrops
    OP
    Jun 3, 2019 via Android
    13
    @lff0305 自动优化这点以前没有想到,我按照这个思路再排查一下,谢谢你的建议
    0ZXYDDu796nVCFxq
    0ZXYDDu796nVCFxq
    Jun 3, 2019 via Android
    14
    一般来说,各种语言的 print 性能损耗都挺大
    Deardrops
    Deardrops
    OP
    Jun 3, 2019 via Android
    15
    仔细看下代码的话,其实普通函数版本在开始记时到结束记时的范围内,并没有 printf 语句哦。因此 printf 和 printk 函数并不是影响执行效率的主要原因。
    glogo
    glogo
    Jun 3, 2019
    16
    什么代码?
    yangzhezjgs
    yangzhezjgs
    Jun 3, 2019
    17
    我觉得 ftime 这个函数调用的时候也会发生系统调用,因为获取系统时钟应该是要访问内核的
    shylockhg
    shylockhg
    Jun 3, 2019
    18
    兄弟获取时间不要 syscall,你确定么。。。
    goreliu
    goreliu
    Jun 3, 2019 via Android
    19
    可能是两边优化程度不一样导致的。运行的正常分支走不到 print,获取时间单个函数的调用耗时很少,不会有那么大影响。
    shylockhg
    shylockhg
    Jun 3, 2019
    20
    还有 printf 也比 printk 耗时多了
    pymumu
    pymumu
    Jun 3, 2019 via iPhone
    21
    gcc O2 优化了
    smdbh
    smdbh
    Jun 3, 2019 via iPhone
    22
    弱弱的问下,用户态默认是独占 cpu,不被调度吗
    zwh2698
    zwh2698
    Jun 3, 2019 via Android
    23
    不用状态切换
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1560 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 59ms · UTC 23:03 · PVG 07:03 · LAX 15:03 · JFK 18:03
    ♥ Do have faith in what you're doing.