C++ 为什么原始 double 数组中的赋值似乎比 double 变量赋值快得多?

机电

我正在尝试编写 Mandelbrot 集算法的简化版本。但是,通过将一个像素的每个 Z 存储在一个数组中并使用 Z[n] 计算 Z[n+1] 来计算 Z_n+1 似乎比仅存储 Z_n 来计算 Z_n+1 更快。这对我来说没有多大意义。

我正在用 Qt 用 C++ 编程,在发布模式下运行。

版本一(快速):

    // inside QWidget-class
    int numberIterations = 500;
    double dw = width();
    double dh = height();
    int iw = width();
    int ih = height();
    int colors[iw][ih] = {};
    double cr = 0.0;
    double cc = 0.0;
    double zr[numberIterations] = {0.0};
    double zc[numberIterations] = {0.0};
    for (int x = 0; x < iw; x++) {
        for (int y = 0; y < ih; y++) {
            cr = ((double)x/dw)*3.0-2.0;
            cc = ((double)y/dh)*2.0-1.0;

            colors[x][y]=0;

            QTime time;
            time.start();
            for(int n=1; n<numberIterations; n++){

                zr[n] = zr[n-1]*zr[n-1] -(zc[n-1]*zc[n-1]) + cr;
                zc[n] = zr[n-1]*zc[n-1] + cc;

                if(qAbs(zr[n])>2.0 || qAbs(zc[n])>2.0){ // to simplify it
                    colors[x][y]=1;
                    break;
                }
            }
            qDebug() << time.elapsed(); // prints almost always 0 (ms)
        }
    }

如您所见,我将复数 Z 的实部和 i 部分分开。通过求解二项式,很容易以这种方式进行计算,但在这种情况下实际上并不重要,因为实际计算是相同的。版本 2(慢):

// ... 
    double zr = 0.0;
    double zc = 0.0;
    double zr_old = 0.0;
    for (int x = 0; x < iw; x++) {
        for (int y = 0; y < ih; y++) {
            cr = ((double)x/dw)*3.0-2.0;
            cc = ((double)y/dh)*2.0-1.0;

            colors[x][y]=0;

            QTime time;
            time.start();
            for(int n=1; n<numberIterations; n++){

                zr_old = zr;
                zr = zr*zr -(zc*zc) + cr;
                zc = zr_old*zc + cc;

                if(qAbs(zr)>2.0 || qAbs(zc)>2.0){
                    colors[x][y]=1;
                    break;
                }
            }
            qDebug() << time.elapsed(); // prints about 2 on average (0-6)
        }
    }

对我来说,在索引处访问 double 数组中的元素比仅使用 double 变量更快,这听起来很奇怪……实际上是这种情况还是我错过了使内部 for 循环(n)慢得多的东西何时使用变量(当然还有一项额外的赋值)?也许我现在只是瞎了,但我只是不明白……

编辑 1

正如 Dmytro Dadyka 指出的那样,我的第二个版本是错误的。在数组中,第一个元素始终为零(约定),但是当切换到下一个像素时,我没有将像素循环内的变量归零,这给了我错误的计算时间,因为内部 for 循环的迭代次数是那么更大。它必须是:

    // ...
    double zr = 0.0;
    double zc = 0.0;
    for (int x = 0; x < iw; x++) {
        for (int y = 0; y < ih; y++) {
            zr = 0.0;
            zc = 0.0;
            for(int n=1; n<numberIterations; n++){
                // ...
            }
        }
    }

但是,此版本计算所有像素值所需的时间仍比数组版本长约 10%。这很奇怪,因为它应该像 Garf365 指出的那样需要更多的说明。

德米特罗·达迪克

你给出的例子并不等同。第一种情况下的初始zrzc值是zr[0] = 0zc[0] = 0并且每个(x, y)像素都相同在第二种情况下,初始zrzc值是前一个像素的最终值。我认为它破坏了计算逻辑,并且在第二种情况下您会得到错误的迭代计数。通过zrzc在循环中初始化来修复您的代码

for (int x = 0; x < iw; x++) {
    for (int y = 0; y < ih; y++) {
        cr = ((double)x/dw)*3.0-2.0;
        cc = ((double)y/dh)*2.0-1.0;
        double zr = 0.0;
        double zc = 0.0;

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么Python中的这段代码比C ++快得多?

来自分类Dev

为什么数组的直接索引比迭代快得多?

来自分类Dev

为什么数组的直接索引比迭代快得多?

来自分类Dev

为什么<比!=快得多?

来自分类Dev

为什么不使用double函数中声明的数字?(C)

来自分类Dev

为什么 double a=(double)('z'/'A') 在 C++ 中只给出整数部分?

来自分类Dev

C ++中double和DOUBLE之间的区别

来自分类Dev

C ++在int变量中存储double

来自分类Dev

C中的值是double的

来自分类Dev

为什么numpy的累积量比手动C ++的循环快得多?

来自分类Dev

为什么C ++ Lambda函数作为比较函数比等效对象快得多

来自分类Dev

在Java中,对于原始数组,重用数组比重复创建它们快得多吗?

来自分类Dev

为什么性能测试向我显示列表比使用我的代码的数组快得多?

来自分类Dev

为什么列表理解比数组乘以numpy要快得多?

来自分类Dev

为什么JS中的简单阶乘算法比Python或R中的速度快得多?

来自分类Dev

为什么变量1 + =变量2比变量1 =变量1 +变量2快得多?

来自分类Dev

为什么在此Perl正则表达式中,“ \ s +”比“ \ s \ s *”快得多?

来自分类Dev

为什么“ in”生成器比python中“ in”列表快得多

来自分类Dev

为什么mv比cp快得多?如何从错误的mv命令中恢复?

来自分类Dev

为什么StringBuilder比String快得多

来自分类常见问题

为什么字典比列表快得多?

来自分类Dev

为什么PreparedStatement比Statement快得多?

来自分类Dev

为什么熊猫.isin比“ in”快得多?

来自分类Dev

在旧 C 中,这是什么意思?double (*Window)(double)

来自分类Dev

为什么在字符串上md5哈希比在python中的numpy数组上快得多?

来自分类Dev

在C中对double数组进行排序

来自分类Dev

如何在C中打印double数组?

来自分类Dev

是什么原因造成的,Swift应该比Objective-C快得多?

来自分类Dev

是什么原因造成的,Swift应该比Objective-C快得多?

Related 相关文章

  1. 1

    为什么Python中的这段代码比C ++快得多?

  2. 2

    为什么数组的直接索引比迭代快得多?

  3. 3

    为什么数组的直接索引比迭代快得多?

  4. 4

    为什么<比!=快得多?

  5. 5

    为什么不使用double函数中声明的数字?(C)

  6. 6

    为什么 double a=(double)('z'/'A') 在 C++ 中只给出整数部分?

  7. 7

    C ++中double和DOUBLE之间的区别

  8. 8

    C ++在int变量中存储double

  9. 9

    C中的值是double的

  10. 10

    为什么numpy的累积量比手动C ++的循环快得多?

  11. 11

    为什么C ++ Lambda函数作为比较函数比等效对象快得多

  12. 12

    在Java中,对于原始数组,重用数组比重复创建它们快得多吗?

  13. 13

    为什么性能测试向我显示列表比使用我的代码的数组快得多?

  14. 14

    为什么列表理解比数组乘以numpy要快得多?

  15. 15

    为什么JS中的简单阶乘算法比Python或R中的速度快得多?

  16. 16

    为什么变量1 + =变量2比变量1 =变量1 +变量2快得多?

  17. 17

    为什么在此Perl正则表达式中,“ \ s +”比“ \ s \ s *”快得多?

  18. 18

    为什么“ in”生成器比python中“ in”列表快得多

  19. 19

    为什么mv比cp快得多?如何从错误的mv命令中恢复?

  20. 20

    为什么StringBuilder比String快得多

  21. 21

    为什么字典比列表快得多?

  22. 22

    为什么PreparedStatement比Statement快得多?

  23. 23

    为什么熊猫.isin比“ in”快得多?

  24. 24

    在旧 C 中,这是什么意思?double (*Window)(double)

  25. 25

    为什么在字符串上md5哈希比在python中的numpy数组上快得多?

  26. 26

    在C中对double数组进行排序

  27. 27

    如何在C中打印double数组?

  28. 28

    是什么原因造成的,Swift应该比Objective-C快得多?

  29. 29

    是什么原因造成的,Swift应该比Objective-C快得多?

热门标签

归档