gpt4 book ai didi

C++ map 性能 - Linux(30 秒)与 Windows(30 分钟)!

转载 作者:可可西里 更新时间:2023-11-01 18:41:46 25 4
gpt4 key购买 nike

我需要处理一个文件列表。不应对同一个文件重复处理操作。我为此使用的代码是 -

using namespace std;

vector<File*> gInputFileList; //Can contain duplicates, File has member sFilename
map<string, File*> gProcessedFileList; //Using map to avoid linear search costs

void processFile(File* pFile)
{
File* pProcessedFile = gProcessedFileList[pFile->sFilename];
if(pProcessedFile != NULL)
return; //Already processed

foo(pFile); //foo() is the action to do for each file
gProcessedFileList[pFile->sFilename] = pFile;
}

void main()
{
size_t n= gInputFileList.size(); //Using array syntax (iterator syntax also gives identical performance)
for(size_t i=0; i<n; i++){
processFile(gInputFileList[i]);
}
}

代码工作正常,但是......

我的问题是,当输入大小为 1000 时,在 Windows/Visual Studio 2008 Express 上需要 30 分钟——半小时。同样的输入,在Linux/gcc上运行仅需40秒!

可能是什么问题?单独使用时, Action foo() 只需很短的时间即可执行。我应该为 map 使用 vector::reserve 之类的东西吗?

编辑,额外信息

foo() 所做的是:1. 打开文件2.读入内存3.关闭文件4.解析内存中的文件内容5.它建立了一个代币列表;我为此使用了一个 vector 。

每当我中断程序时(同时使用 1000 多个文件输入集运行程序):调用堆栈显示程序在 std::vector add 的中间。

最佳答案

在 Microsoft Visual Studio 中,访问标准 C++ 库时有一个全局锁,以防止在调试版本中出现多线程问题。这可能会导致很大的性能损失。例如,我们的完整测试代码在 Linux/gcc 上运行 50 分钟,而在 Windows VC++2008 上需要 5 小时。请注意,在 Release模式下使用非调试 Visual C++ 运行时进行编译时,不存在这种性能损失。

关于C++ map 性能 - Linux(30 秒)与 Windows(30 分钟)!,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2832023/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com