C++ 如何应对慢向量<;字符串>;析构函数?

C++ 如何应对慢向量<;字符串>;析构函数?,c++,string,performance,vector,destructor,C++,String,Performance,Vector,Destructor,以下问题是否有众所周知的解决方案 你有很多字符串的向量 你很乐意用几十万个字符串填充它,而且速度很快 以任意方式操纵字符串;生活是美好的 向量已经完成了;vector超出了范围,现在你必须去喝点咖啡,然后坐下来,而每根线都会一根一根地被破坏 编辑:问题解决了! 我只是在同一台计算机上在Linux上运行了下面的代码,结果很好,这让我找到了解决方案。结果是我的系统出现了问题——这是我很久以前自己造成的,但我已经忘记了。 解决问题后,时间大大缩短,甚至比使用GCC更好 不过这是一个很好的谜

以下问题是否有众所周知的解决方案

  • 你有很多字符串的向量

  • 你很乐意用几十万个字符串填充它,而且速度很快

  • 以任意方式操纵字符串;生活是美好的

  • 向量已经完成了;vector超出了范围,现在你必须去喝点咖啡,然后坐下来,而每根线都会一根一根地被破坏

编辑:问题解决了! 我只是在同一台计算机上在Linux上运行了下面的代码,结果很好,这让我找到了解决方案。结果是我的系统出现了问题——这是我很久以前自己造成的,但我已经忘记了。
解决问题后,时间大大缩短,甚至比使用GCC更好

不过这是一个很好的谜题,所以我不会发布答案,而是做一些其他的事情:
我现在不能在这个问题上悬赏,但如果你认为你知道原因,试试看。如果它是正确的,我会接受它,并给你一个不错的赏金。(如果我忘了给你赏金,请提醒我!)
如果没有人知道的话,我会在一段时间后自己发布

示例代码: 我过去和任何人一样怀疑,但现在我想人们确实有一个观点,当他们认为STL很慢的时候
这在我的笔记本电脑上花费了3.95秒:(洗牌非常关键)

#包括
#包括
#包括
#包括
#包括
#包括
int main()
{
使用名称空间std;
srand((无符号)时间(NULL));
时钟没有启动;
{
向量v(400000);
对于(size_t i=0;i

我觉得这个程序是在内部使用一些O(N2)算法,无论是在Visual C++还是在Windows中。不确定发生了什么,但很有意思…

将自定义分配器与释放一起使用。

为什么不动态创建向量本身,以便使用引用计数智能指针来管理它呢。然后,您可以确保最后引用它的线程不是UI线程,这样UI线程就不会在超出范围时执行处理

您甚至可以操纵执行处理的线程的优先级,以使其较低,并且不会严重影响其他线程-它将确保UI线程排在较低优先级线程之前


注意:我从未尝试过,但我不明白为什么它不起作用-但花时间在上面,风险自负!:)好吧,既然没人知道


这是因为在我的系统中被打开了。一旦我删除了它,代码很快就完成了。

听起来你已经回答了你的问题:
“喝点咖啡”
-说真的,它真的那么糟糕吗?哇。。。3秒取消分配几个100k字符串。。。那太慢了。。。每个字符串超过几千个循环。这是什么内存分配器?@MikeBantegui:那我就不能操作字符串了。@OliCharlesworth:几秒钟听起来很可疑。我做了一个数值模拟,在一棵树中分配12GB内存,只需几毫秒就可以释放所有数据。没有理由在短于几GB的数据上释放3秒以上的数据。在处理文件名时,是否可能(部分)数据结构已被分页?在这种情况下,当事情被调回时,释放可能会很慢。所以只需将单个
string
s的释放设为不可操作?@Mehrdad:考虑到您拥有的字符串数量,本地大量池是有意义的,不是吗?@MatthieuM.:可能。。。我还没试过呢,很好。你是怎么知道的?@Vieta:我在Linux上试过,效果很好,所以我想这应该是Windows中与堆相关的低级功能。然后让我检查全局标志。。。当我看到它启用时,我记得我大约在一年前启用了它,因为它当时似乎没有任何负面影响。结果证明我错了P
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <ctime>
#include <string>
#include <vector>

int main()
{
    using namespace std;
    srand((unsigned)time(NULL));
    clock_t start;
    {
        vector<string> v(400000);
        for (size_t i = 0; i < v.size(); i++)
        {
            v[i].resize(16 + rand() % 32);  // some variation
        }

        // shuffle
        for (size_t i = 0; i < (size_t)pow((double)v.size(), 1.15); i++)
        {
            size_t j = rand() * (RAND_MAX + 1) + rand();
            swap(v[i % v.size()], v[j % v.size()]);
        }
        
        printf("Going out of scope...\n"); fflush(stdout);
        start = clock();
    }
    clock_t end = clock();
    printf("%u ms\n", (end - start) * 1000 / CLOCKS_PER_SEC);
    return 0;
}