Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 同样的程序在Linux上比Windows更快——为什么?_C++_Windows_Linux_Gcc_Benchmarking - Fatal编程技术网

C++ 同样的程序在Linux上比Windows更快——为什么?

C++ 同样的程序在Linux上比Windows更快——为什么?,c++,windows,linux,gcc,benchmarking,C++,Windows,Linux,Gcc,Benchmarking,这个问题的解决方案可以在Glibc的floor()中找到。可能是在系统库中实现的 我有一个非常小的C++程序(100行)用于物理模拟。我用GCC4.6.1在同一台计算机上的Ubuntu Oneiric和Windows XP上编译了它。我使用了完全相同的命令行选项(相同的makefile) 奇怪的是,在Ubuntu上,程序完成的速度比在Windows上快得多(~7.5秒vs 13.5秒)。在这一点上,我认为这是一个编译器的差异(尽管使用相同的版本) 但更奇怪的是,如果我在wine下运行Windo

这个问题的解决方案可以在Glibc的
floor()中找到。
可能是在系统库中实现的


我有一个非常小的C++程序(100行)用于物理模拟。我用GCC4.6.1在同一台计算机上的Ubuntu Oneiric和Windows XP上编译了它。我使用了完全相同的命令行选项(相同的makefile)

奇怪的是,在Ubuntu上,程序完成的速度比在Windows上快得多(~7.5秒vs 13.5秒)。在这一点上,我认为这是一个编译器的差异(尽管使用相同的版本)

但更奇怪的是,如果我在wine下运行Windows可执行文件,它仍然比在Windows上快(我得到11秒的“真实”时间和7.7秒的“用户”时间——这包括wine启动时间)

我很困惑。当然,如果相同的代码在同一个CPU上运行,那么时间上就不应该有差异

原因是什么?我做错了什么

该程序执行最小的I/O(输出一行),并且仅使用STL中的固定长度
向量
(即,不应涉及任何系统库)。在Ubuntu和Windows上,我使用默认的gcc。在进行基准测试时,我验证了CPU使用率接近于零(我关闭了大多数程序)。在Linux上,我使用
time
来计时。在Windows上,我使用了
timethis.exe

更新

我做了一些更精确的计时,比较了在Windows XP、Wine和Linux上编译的gcc和msvc程序的不同输入(运行时必须与输入成比例)的运行时间。所有数字均以秒为单位,且至少运行3次

在我使用的Windows上(墙时间),在Linux和Wine上我使用时间(CPU时间)。(timethis.exe在Wine上被破坏)我确保没有其他程序在使用CPU,并禁用了病毒扫描程序

gcc的命令行选项是
-march=pentium-m-Wall-O3-fno exceptions-fno rtti
(即禁用了异常)

我们从这些数据中看到的:

  • 差异不是由于进程启动时间造成的,因为运行时间与输入成比例

  • 在Wine和Windows上运行的区别只存在于gcc编译的程序,而不是msvc编译的程序:它不能被占用Windows上CPU的其他程序或timethis.exe被破坏而引起


  • 您可能会对涉及到的系统库感到惊讶。只需在你的应用程序上执行ldd,然后查看使用了哪些(好的,没有那么多,但肯定是glibc)

    为了完全相信您关于执行速度的发现,您需要按顺序运行应用程序几次,并计算平均执行时间。可能是操作系统加载程序的速度较慢(尽管4s加载时间较长)

    其他很可能的原因是:

  • 不同的malloc实现
  • 异常处理,如果使用到极端可能会导致速度减慢(Windows GCC、MinGW可能不是最佳的异常处理明星)
  • 依赖操作系统的初始化:需要在Windows上的程序启动时完成,但在Linux上不需要
  • 其中大多数都很容易进行基准测试;-)



    更新您的更新:您现在唯一可以做的就是配置文件。别再猜测了,让档案员告诉你时间花在哪里。使用gprof和Visual Studio内置的探查器,比较在不同功能中花费的时间。

    显然,差异与系统有关

    您可以使用
    strace
    来了解系统调用是如何完成的,例如

    strace -o /tmp/yourprog.tr yourprog
    
    然后查看
    /tmp/yourprog.tr

    (如果Windows上存在相当于
    strace
    ,请尝试使用它)

    也许您的程序正在分配内存(使用
    mmap
    系统调用),也许Linux(甚至Wine)上与内存相关的系统调用比Windows更快?或者其他一些系统调用在Linux上提供了比Windows更快的功能


    注意。我对Windows一无所知,因为我从1986年开始使用Unix系统,从1993年开始使用Linux。

    在代码中进行基准测试。还可以尝试使用VisualStudio进行编译。在windows上,如果你有一些应用程序,比如Yahoo Messenger,正在安装钩子,它们可以很容易地降低你的应用程序加载速度

    在您拥有的windows上:QueryPerformanceCounter
    在Linux上:clock_gettime

    这个东西使用了多少内存?你试过在分析器下运行它吗?这就像说如果两辆不同的车(一辆卡车和一辆小型跑车)使用相同的发动机,它们应该以相同的速度加速?可能是Windows上的启动时间更长吗?如果让程序运行更长时间,这会如何影响Windows和Linux之间的时间差?@bdonlan根据Process Explorer,它使用的内存不足1 MB。@celtschk我会检查一下。我无法快速回复,因为我需要重新启动才能在Linux上测试。我运行了很多次,以确保时间正确(我学习了物理,所以我在实验课上学到了这一课)。好的,首先我将单次运行时间增加到一分钟以上,我将禁用异常(我不使用它们),将使用C样式的数组代替
    std::vector
    ,以消除所有malloc/new,然后我将重试。这需要一段时间,因为我也需要重新启动。请查看我对问题的编辑。我排除了第2点。三,。第1点。仍然有可能,但据我所知,我的程序不应该在堆上分配内存,除非在启动时初始化了
    std::vector
    。我会尝试一下。关于对标题的编辑,同样的可执行文件在Windows或Wine上运行时也会有所不同(不仅仅是源代码在不同的系统上编译时)。这对我来说真的很奇怪。当你使用Wine时,你是在间接地使用Linux内核。所以这并不奇怪(无论是Wine还是Linux,您都在使用s