鱼C论坛

 找回密码
 立即注册
查看: 197|回复: 12

[已解决]G++ 编译太慢了

[复制链接]
发表于 2024-9-16 19:11:16 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
Windows11 WSL2 Ubuntu 下的 G++(gcc version 11.4.0 (Ubuntu 11.4.0-1ubuntu1~22.04) 的编译速度特别慢,like this:
hp@/home/hp/Test$ cat aplusb.cpp
#include <bits/stdc++.h>
using namespace std;

int main() {
        int a, b;
        cin >> a >> b;
        cout << a + b << "\n";
        return 0;
}
hp@/home/hp/Test$ time g++ aplusb.cpp

real    0m11.408s
user    0m0.731s
sys     0m0.222s

平常我用这台电脑编译相同的文件只需要 3.67s,用 WSL2 Ubuntu 就要这么长时间。平常经常需要使用 Linux 格式的可执行文件,所以这很重要。这怎么解决?
最佳答案
2024-9-16 19:33:27
zhangjinxuan 发表于 2024-9-16 19:31
我期望的是能在 /mnt/ 下编译文件,可不可以直接就将编译中间产生的文件在 Linux 盘中创建修改,然后结果 ...

不能
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-9-16 19:11:47 | 显示全部楼层
编译速度慢可能由以下几种原因引起:

1. **CPU 性能**:WSL2 虽然性能较好,但如果你的 CPU 性能较低,编译时间会比较长。

2. **磁盘 I/O**:文件存储在 Windows 文件系统中(如 `/mnt/c`),编译速度会受到文件系统性能的影响。建议将文件放在 WSL2 的 Linux 文件系统中(如 `/home/你的用户名`)。

3. **软件版本**:确保你的 WSL 和编译器是最新版本。有时,新版本对性能有改进。

4. **系统配置**:确保 WSL2 有足够的资源,比如 CPU 和内存,可以考虑在 WSL2 的配置文件(`.wslconfig`)中增加资源分配。

优化建议:

1. **移动文件到 Linux 文件系统**:
  
mv /mnt/c/path/to/your/project /home/yourusername/

2. **使用“Makefile”管理编译**:可以更高效地管理你的编译流程。

3. **开启并行编译**:使用 `-j` 选项,指定多个线程:
  
g++ -j$(nproc) aplusb.cpp -o aplusb
    其中 `$(nproc)` 会自动获取 CPU 核心数量。

4. **增加 WSL2 资源**:
    编辑 `~/.wslconfig` 文件,添加如下内容:
  
[wsl2]
    memory=4GB # 设置 WSL2 使用的内存
    processors=4 # 设置 WSL2 使用的 CPU 核心数

通过以上方法可以有效提高 G++ 的编译速度。如果问题仍然存在,可以考虑启用更具性能的编译器或者改用物理机上的编译环境。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-9-16 19:17:25 | 显示全部楼层
把 #include <bits/stdc++.h> 去掉试试
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-9-16 19:19:34 | 显示全部楼层
人造人 发表于 2024-9-16 19:17
把 #include  去掉试试

不影响。是楼上说的磁盘性能 I/O 问题(即 /mnt 下特别慢),但有时为了方便也需要在 /mnt/c(d,e) 下编译。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-9-16 19:20:55 | 显示全部楼层
zhangjinxuan 发表于 2024-9-16 19:19
不影响。是楼上说的磁盘性能 I/O 问题(即 /mnt 下特别慢),但有时为了方便也需要在 /mnt/c(d,e) 下编译 ...

在这个下编译快
/dev/shm
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-9-16 19:21:07 | 显示全部楼层
FishC 发表于 2024-9-16 19:11
编译速度慢可能由以下几种原因引起:

1. **CPU 性能**:WSL2 虽然性能较好,但如果你的 CPU 性能较低, ...

有时为了方便我需要在 /mnt 下编译,这应该如何行动?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-9-16 19:21:15 | 显示全部楼层
zhangjinxuan 发表于 2024-09-16 19:21
有时为了方便我需要在 /mnt 下编译,这应该如何行动?


好,既然你需要在 `/mnt` 文件系统中进行编译,可以尝试以下几种方法来优化编译速度:

1. **减少I/O操作**:尽量将中间文件放在 Linux 文件系统中,仅仅在最终结果需要的时候才移回到 `/mnt` 文件系统。
   
2. **使用临时软链接**:
   - 创建项目的 Linux 文件系统软链接,这样可以避免直接在 `/mnt` 下大量读写。
   
ln -s /mnt/c/path/to/your/project ~/project_link
   cd ~/project_link
   g++ aplusb.cpp -o aplusb

3. **开启并行编译**:
   - 如之前提到的,使用 `-j` 选项通过多线程加速编译。
   
g++ -j$(nproc) aplusb.cpp -o aplusb

4. **利用 RAM 盘**:
   - 在内存中创建一个临时文件系统,将项目复制进去,编译完成后再复制回 `/mnt` 下。
   
mkdir /tmp/ramdisk
   sudo mount -t tmpfs -o size=512M tmpfs /tmp/ramdisk
   cp -r /mnt/c/path/to/your/project /tmp/ramdisk/
   cd /tmp/ramdisk/project
   g++ aplusb.cpp -o aplusb
   cp aplusb /mnt/c/path/to/your/project/
   sudo umount /tmp/ramdisk

5. **使用 ccache(编译缓存)**:
   - 如果你经常编译相同或类似的文件,可以使用 `ccache` 来加速。
   
sudo apt-get install ccache
   export CC='ccache gcc'
   export CXX='ccache g++'
   g++ aplusb.cpp -o aplusb

6. **优化 WSL2 配置**:
   - 确保 WSL2 的配置文件中有足够的资源配置,如 CPU 核心数和内存,参见之前的 `.wslconfig` 设置。

通过这些方法,你可以在保留使用 `/mnt` 的灵活性的同时,提升编译速度。希望这些技巧对你有帮助!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-9-16 19:31:18 | 显示全部楼层

我期望的是能在 /mnt/ 下编译文件,可不可以直接就将编译中间产生的文件在 Linux 盘中创建修改,然后结果文件直接输出到对应的位置呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-9-16 19:32:27 | 显示全部楼层
zhangjinxuan 发表于 2024-09-16 19:31
我期望的是能在 /mnt/ 下编译文件,可不可以直接就将 ...


当然可以。你可以通过更改输出目录和临时文件目录来实现。以下是一步步操作的方法:

1. **创建一个 Linux 文件系统中的临时目录**:
  
mkdir -p /home/hp/temp_compile

2. **使用 `-o` 选项将最终结果输出到 `/mnt` 文件系统中,而将中间文件放在 Linux 文件系统中的临时目录中**:
  
g++ -o /mnt/c/你的路径/输出文件 /home/hp/temp_compile/中间文件路径 你的源码.cpp

3. 示例命令(假设你有一个 `aplusb.cpp` 文件):
  
g++ -o /mnt/c/你的输出路径/aplusb /home/hp/temp_compile/temp_file.o aplusb.cpp

4. 使用 `-save-temps` 选项保存中间文件,然后手动移动中间文件:
  
g++ -save-temps -o /mnt/c/WinOutput/aplusb aplusb.cpp
    mv *.o /home/hp/temp_compile/

这样,中间的编译过程将在性能较好的 Linux 文件系统中完成,而最终的可执行文件将被输出到 `/mnt` 文件系统中。这种方法应该能大幅提升编译速度。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-9-16 19:32:36 | 显示全部楼层
FishC 发表于 2024-9-16 19:21
好,既然你需要在 `/mnt` 文件系统中进行编译,可以尝试以下几种方法来优化编译速度:

1. **减少I/O ...

可不可以直接就将编译中间产生的文件在 Linux 盘中创建修改,然后结果文件直接输出到对应的位置呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-9-16 19:32:54 | 显示全部楼层
zhangjinxuan 发表于 2024-09-16 19:32
可不可以直接就将编译中间产生的文件在 Linux 盘中创 ...


是的,可以通过设置编译缓存目录的方式来实现这个需求,使用 `g++` 编译器时,可以使用 `-save-temps` 或 `-pipe` 选项以及改变TMPDIR环境变量来改善编译中的磁盘 I/O 性能。

以下是具体步骤:

1. **设置临时文件目录**:
  
export TMPDIR=/home/hp/temp_compile

2. **编译时使用 `-o` 选项指定输出文件位置**:
  
g++ -o /mnt/c/your_output_file your_source_file.cpp

例如:
export TMPDIR=/home/hp/temp_compile
g++ -o /mnt/c/aplusb aplusb.cpp

这样,编译中间产生的文件会放在 Linux 文件系统中的 `/home/hp/temp_compile` 目录中,最终的输出文件会生成在 `/mnt/c` 中,极大地减少了对 `/mnt` 文件系统的读写操作,能显著提升编译速度。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-9-16 19:33:27 | 显示全部楼层    本楼为最佳答案   
zhangjinxuan 发表于 2024-9-16 19:31
我期望的是能在 /mnt/ 下编译文件,可不可以直接就将编译中间产生的文件在 Linux 盘中创建修改,然后结果 ...

不能
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-9-18 00:49:35 | 显示全部楼层
由于WSL2在Windows 11下的文件系统访问可能会受到Windows Defender(或其他杀毒软件)的影响,从而导致编译速度变慢。

编译过程显示real时间远大于user和sys时间,这通常意味着I/O操作受到阻碍。

评分

参与人数 1贡献 +5 收起 理由
zhangjinxuan + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-23 16:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表