Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用C+中的向量加速计算+;通过使用指针/引用 目前,我正在制作一个C++程序,解决数独问题。为了做到这一点,我经常计算数独的“能量”(故障数)。不幸的是,此计算占用了大量计算时间。我认为,通过在计算中使用指针和引用,可以显著加快计算速度,但在解决如何实现这一点时遇到了困难_C++_Pointers_Vector_Reference - Fatal编程技术网

使用C+中的向量加速计算+;通过使用指针/引用 目前,我正在制作一个C++程序,解决数独问题。为了做到这一点,我经常计算数独的“能量”(故障数)。不幸的是,此计算占用了大量计算时间。我认为,通过在计算中使用指针和引用,可以显著加快计算速度,但在解决如何实现这一点时遇到了困难

使用C+中的向量加速计算+;通过使用指针/引用 目前,我正在制作一个C++程序,解决数独问题。为了做到这一点,我经常计算数独的“能量”(故障数)。不幸的是,此计算占用了大量计算时间。我认为,通过在计算中使用指针和引用,可以显著加快计算速度,但在解决如何实现这一点时遇到了困难,c++,pointers,vector,reference,C++,Pointers,Vector,Reference,在我的解算器类中,我有一个向量向量colVec=\u数独[col]复制/传输所有元素,而const vector&colVec=_sudoku[col]不会(它仅为右侧创建别名) 与bool-SudokuSolver::isUnique(vector v,int n){与bool-SudokuSolver::isUnique(const-vector&v,int n){ 根据Jesper Juhl的建议编辑:const添加确保不会错误地更改参考内容 编辑2:另一件需要注意的事情是vector r

在我的解算器类中,我有一个
向量
向量colVec=\u数独[col]
复制/传输所有元素,而
const vector&colVec=_sudoku[col]不会(它仅为右侧创建别名)

bool-SudokuSolver::isUnique(vector v,int n){
bool-SudokuSolver::isUnique(const-vector&v,int n){

根据Jesper Juhl的建议编辑:
const
添加确保不会错误地更改参考内容

编辑2:另一件需要注意的事情是
vector rowVec(_dim);
这些向量在每次迭代中都是连续分配和未分配的,这可能会带来成本

int SudokuSolver::rowUniques() {
    int count = 0;
    vector<int> rowVec(_maximumDim); // Specify maximum dimension       
    for (int row = 0; row < _dim; row++) {
        for (int i = 0; i < _dim; i++) {
            rowVec[i] = _sudoku[i][row];
        }
        for (int i = 1; i <= _dim; i++) {
            if (isUnique(rowVec, i)) {
                count++;
            }
        }
    }
    return count;
}
int SudokuSolver::rowUniques(){
整数计数=0;
向量rowVec(_maximumDim);//指定最大维度
对于(整行=0;行<_dim;行++){
对于(int i=0;i<\u dim;i++){
rowVec[i]=_数独[i][row];
}

对于(int i=1;i如果您将您的
SudokuSolver::isUnique
更改为采用
vector&v
,这是唯一需要做的更改,即按引用传递而不是按值传递。使用指针传递与按引用传递类似,不同之处在于指针可以重新分配,或者为空,而引用则不能

我怀疑,如果您正在处理一个足够大的问题,您将能够分辨出一个大的副本,那么您将看到一些性能提高(如果您的问题很小,则很难看到较小的性能提高)


希望这有帮助!

您可能希望使用探查器查看应用程序中的瓶颈位置,并进行更改以优化这些瓶颈。步骤1)将确保在启用编译器优化器的情况下构建程序。步骤2)然后在优化的代码上使用探查器来确定实际的瓶颈在哪里。谢谢。我确实尝试过这样做,并跟踪到我在问题的最后一部分中提到的行。我很难理解要做哪些更改。幸运的是,已经给出的答案对此有帮助。@mand您没有发布您使用的设置您运行的是优化的构建还是未优化的“调试”生成?如果是未优化的生成,请重新编译您的程序以使用优化并重新测试。@PaulMcKenzie,感谢您的回复。我使用Visual Studio在Windows上调试。我发现我的优化设置已关闭。将其更改为/O2大大提高了速度,尽管通过引用更改的效果更大。这让我不知道在cmd中编译和运行与使用VS调试的运行速度是否不同。确实如此,命令提示符(带/O2)甚至比使用/O2的VS快得多。显然,所有的调试工具都会减慢进程。您可能想在其中撒一点
const
。)这就像@CoffeeBeforeArch的评论一样,产生了巨大的不同!代码现在运行速度大约快了100/~1000倍。谢谢您为我指明了正确的方向并帮助我!@Tetix,您的Edit 2建议也有效,虽然不太明显,但可能会有一点不同。由于每次都会覆盖这些值,因此对实现没有影响。进一步检查后,该函数最昂贵的部分是isUnique().我已经附上了该函数的计算配置文件!但我个人不知道如何进一步优化它。如果其他人这样做,我很高兴听到它。