3

所以,我只是在玩用 C++ 实现一些排序算法,但我发现目前对它们进行基准测试很烦人,因为不运行算法而是创建输入数据需要很长时间。我目前测试每个输入长度(1000、2000,...)10 次,以获得稍微平均的时间。对于这 10 次中的每一次,我vector通过执行以下操作创建一个正确长度的新随机数:

    // Each of the 10 times.
    for(int j = 0; j < 10; j++) {

        A.clear();

        // 'i' is the current input size.
        for(int k = 0; k < i; k++) {
            A.push_back(rand() % 10000);
        }

        // Other stuff
    }

有一个更好的方法吗?我是否应该费心将 rand() 限制在 10000,或者这只是我的强迫症大脑喜欢整数?(即,当您认为模运算实际上执行到 - 目前 - 10 的每个循环为 10,000 时,该模运算实际上是否会花费大量时间。)或者,我是否真的应该在每次运行时创建一个新向量种类?我一直这样做是因为我觉得创建的向量可能有偏差,所以如果生成了那个向量然后使用了 10 次,那么答案可能会很不准确......

4

3 回答 3

1

来自 cplusplus.com ( http://www.cplusplus.com/reference/stl/vector/ ) 的引用,它提供了一个非常有用的提示:

“就性能而言,重新分配可能是一项代价高昂的操作,因为它们通常涉及要复制到新位置的向量使用的整个存储空间。因此,每当计划为向量大幅增加大小时,建议明确使用成员函数指示向量的容量vector::reserve。"

在您的情况下,使用vector::reserve几乎肯定会提高性能。

编辑:您可以尝试使用random_shufflehttp://www.cplusplus.com/reference/algorithm/random_shuffle/)在创建矢量后对其进行洗牌(显然,random_shuffle元素数量是线性的)。

于 2010-07-24T15:59:51.947 回答
1

有一个更好的方法吗?

是的,您可能需要在这里做一些事情来帮助加快速度。如前所述,在 std::vector 中保留空间然后将值分配给已知元素会更快。此外,使用非优化编译器时,预递增( ++var 而不是 var++ )更快。只是为了让您的代码保持快速,无论是谁构建它,您可能都想从现在开始考虑这样做。就内存而言,您可能会发现它微不足道,但是当我使用已知大小的无符号且不是不合理的大时,我会在 for 循环中使用无符号的 short。

然而,关于模数。如果您不需要它,您可能不想使用它。根据向量中保存的数据类型,如果结果超出该类型的最大存储容量,则应该换行。

我不知道它是否会通过变量包装消耗更多的处理能力,如果是这样,我仍然不确定它是否比预模运算更便宜。在使用 rand 之前,可能需要运行一些已知大小的速度测试。

    A.reserve(i * i);
    for(unsigned short j = 0; j < 10; ++j) {            
        for(unsigned short k = 0; k < i; ++k) 
            A[k + (i*10)] = rand();                
        // Other stuff
    }

编辑

需要注意的非常小的变化:循环只进行了 10 次,因此您不妨使用无符号字符,而不是短字符。至少在 Win32 上,它占用了一半的内存。

    A.reserve(i * i);
    for(unsigned char j = 0; j < 10; ++j) {            
        for(unsigned char k = 0; k < i; ++k) 
            A[k + (i*10)] = rand();                
        // Other stuff
    }
于 2010-07-24T17:09:27.743 回答
-1

我创建一个,看看:

#include <iostream>
#include <cstdlib>
#include <stdio.h>
#include <time.h>
#include <unistd.h>
#include <sstream>

int main(int argc, char* argv[]){
    if (argc < 2){
        printf("No arguments found\n");
        exit(1);
    }
    int maxi;
    maxi = atoi(argv[1]);
    int * a;
    a = new int [5];

    std::stringstream ss;
    ss << maxi;
    printf(ss.str());
    printf("\n");
}
于 2011-12-28T18:53:07.550 回答