V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
Deardrops
V2EX  ›  Linux

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

  •  1
     
  •   Deardrops ·
    deardrops · Jun 3, 2019 · 7512 views
    This topic created in 2530 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
        1
    tomychen  
       Jun 3, 2019
    你可以分别再试一下别的,比如文件操作

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

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