如何处理慢向量<string>析构函数?</string>

时间:2012-07-18 01:00:27

标签: c++ string performance vector destructor

是否存在以下问题的众所周知的解决方案?

  • 你有很多字符串的向量

  • 你高兴地用几十万个字符串填充它,它很快

  • 你以任意方式操纵你的弦乐;生活很美好。

  • 你完成了向量;矢量超出了范围,现在你必须去拿一些咖啡,然后坐下来,每个字符串一个接一个地被摧毁。

编辑:问题解决了!

我刚刚在同一台计算机上运行Linux下面的代码,这很好,这让我找出解决方案。原来是我的系统 - 我得到的东西很久以前,我已经把自己弄成了,但我忘记了 在解决问题后,时间显着,甚至比GCC更好!

这是一个很好的谜题,所以我不会发布答案,而是做其他事情:
我现在不允许对这个问题给予赏金,但如果你认为你知道原因,那就试一试吧。如果它是正确的,我会接受它并给你一个很好的赏金。 (提醒我,如果我忘了给你赏金!)
如果没有人知道那么我会在一段时间后自己发布。

示例代码:

我曾经像任何人一样持怀疑态度,但现在我猜人们在他们的STL很慢时有一个点!
我的笔记本电脑花了3.95秒:(洗牌很关键)

#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;
}

在我看来,这个程序在内部使用一些O(n 2 )算法,无论是在Visual C ++中还是在Windows中。不确定发生了什么,但这很有趣......

3 个答案:

答案 0 :(得分:8)

使用自定义分配器和大量分配。

答案 1 :(得分:6)

好的,因为没有人想出来......

这是因为我的系统中已启用heap tail checking。删除后,代码很快就完成了。

答案 2 :(得分:0)

为什么不动态创建矢量本身,以便您可以使用引用计数智能指针来管理它。然后,您可以确保对其具有最后引用的线程不是UI线程,因此当UI线程超出范围时,UI线程不是进行处理的线程。

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

注意:我从来没有尝试过,但我不明白为什么它不起作用 - 但花时间在它上面需要您自担风险! :)