C++程序在执行文件操作时在Windows与Linux上运行得慢得多?
C++ program runs much slower on Windows vs Linux when doing file operations?
我使用一个名为ChatScript的开源项目进行自然语言处理应用程序开发。
当您使用 ChatScript 执行生成操作时,它会扫描构成聊天机器人的所有脚本文件。就我而言,这是数百个文件。此过程在Windows 8.1上花费的时间比在 Ubuntu 16.04上花费的时间长近30 倍。 因此,我确实使用Linux进行大部分工作,但是由于某些相关工具,我必须在Windows上完成部分工作,因此我想修改代码库,以便WindowsChatScript编译速度与Linux上一样快。
谁能想到为什么代码在Windows和Linux上运行得这么慢?由于每个平台上运行的C++运行时库中的差异,是否有一些已知C++文件操作代码(读/写/等)在Windows上比Linux慢得多?
通过您上一段中的"代码运行缓慢",我从上下文中假设您指的是编译器???
多年来,我经常和一致地遇到Linux和Windows在磁盘I/O方面的一般,显着的性能差异.NTFS(Windows文件系统)和LINUX文件系统处理大量文件的情况不同,并且在我遇到过的情况下Linux总是更快。
您可能会从回答以下问题中的一些指针中受益:如何让 Windows 像 Linux 一样快地编译C++?,例如对 Windows 驱动器进行碎片整理,以及检查编译器优化的配置方式;其中一些可能会减慢编译器的速度(尽管积极的编译器优化设置可能会减慢编译器的速度, 你最后会生成一个更快的可执行文件,但这可能是你在大部分开发完成后切换到的东西)。
但是为我做所有这些事情从来没有让Windows编译比使用等效磁盘硬件的Linux更快,一次也没有。如果您的代码位于一个磁盘上并且为两个编译提供来源,那么您将在 Windows 构建中看到的任何改进(例如,因为代码放在 SSD 上)也可能在 Linux 构建的改进中复制。
只是为了确认我发现了同样的东西。在普通Mac和快速XPS 15上运行相同的Chatscript脚本。Mac编译代码的速度比Windows快30-50倍。奇怪的是,ChatScript最初是为Windows开发的。我也没有弄清楚为什么会有如此巨大的滞后,尽管Windows PC硬件比运行脚本的Mac强大得多。
所以我遇到了一个解释和一个(部分)解决方案。 与Linux相比,Windows有两个滞后方面:
-
网络行为。根据ChatScript的创建者布鲁斯的说法 Wilcox,Windows服务器代码在引擎盖下更糟糕,并且 在 Windows 的 ChatScript 与 Linux 的 ChatScript 中实现得更糟。 然而,这里的滞后很小。
-
构建时间。这就是在 Linux 中构建机器人需要 10-20 个的地方 秒,在 Windows 上 4-5 分钟。原来原因是 防毒:
"出于对巨大差异的好奇,我们的一位硬件工程师
做了一些分析,发现真正的罪魁祸首是防病毒
软件。禁用Windows Defender的
实时病毒防护功能使4分钟缩短到14秒!即使
保持Windows Defender处于活动状态,但排除
ChatScript-master文件夹也解决了大部分减速问题,
导致:build 0大约需要20秒才能完成。 (https://www.chatbots.org/ai_zone/viewthread/3575/)
因此,对于OP,如果您从Windows Defender中排除CS,或将其关闭,则构建差异将在很大程度上消失。
- 如何在linux终端中同时编译和运行c++代码
- 函数在Windows或Linux上运行时表现不同
- 如何在CPP中创建应该在Windows和Linux上运行的套接字?
- 在 Linux 群集上运行 Windows C++代码
- [longjmp/setjmp]c++ 相同的代码窗口有异常 Linux 没有错误并且运行良好
- 有没有办法让我编写一个可以在Windows和Linux上运行的命令行游戏?
- 无法在 Linux 上运行C++ ZMQ 项目的可执行文件
- 我在使用 boost::serialization 时遇到了一个问题,我的代码在 Linux 中运行良好,但在 Wind
- 如果从脚本运行应用程序,则在 Linux 中使用 GDB
- 在Windows上运行Linux Makefile(.so文件)
- 在RHEL 7上编译MySqlClient,并在RHEL 6上运行(Linux上的G )
- 在c++中使用回调异步运行linux命令
- 在Fix8C++库中运行Linux配置错误
- 从基于窗口的应用程序远程运行Linux命令
- 如何从php运行linux命令
- 如何在 Eclipse 中启动 gdb 调试之前运行 linux 脚本
- 如何从存储在其他文件夹中的C++运行linux可执行文件
- 在windows下运行linux c++代码
- 在从QtProcess运行Linux二进制文件时提供参数
- 在 Arduino UNO 和运行 Linux 的笔记本电脑之间设置蓝牙 (BLE) 通信