这是一个以.ppm文件输出mandelbrot分形的代码.我该如何优化呢?
#include<bits/stdc++.h>
using namespace std;
int findMandelbrot(double cr, double ci, int max_iterations)
{
int i = 0;
double zr = 0.0, zi = 0.0;
while (i < max_iterations && zr * zr + zi * zi < 4.0)
{
double temp = zr * zr - zi * zi + cr;
zi = 2.0 * zr * zi + ci;
zr = temp;
++i;
}
return i;
}
double mapToReal(int x, int imageWidth, double minR, double maxR)
{
double range = maxR - minR;
return x * (range / imageWidth) + minR;
}
double mapToImaginary(int y, int imageHeight, double minI, double maxI)
{
double range = maxI - minI;
return y * (range / imageHeight) + minI;
}
int main()
{
ifstream f("input.txt");
int imageWidth, imageHeight, maxN;
double minR, maxR, minI, maxI;
if (!f)
{
cout << "Could not open file!" << endl;
return 1;
}
f >> imageWidth >> imageHeight >> maxN;
f >> minR >> maxR >> minI >> maxI;
ofstream g("output_image.ppm");
g << "P3" << endl;
g << imageWidth << " " << imageHeight << endl;
g << "255" << endl;
double start = clock();
for (int i = 0; i < imageHeight; i++)
{
for (int j = 0; j < imageWidth; j++)
{
double cr = mapToReal(j, imageWidth, minR, maxR);
double ci = mapToImaginary(i, imageHeight, minI, maxI);
int n = findMandelbrot(cr, ci, maxN);
int r = ((int)sqrt(n) % 256);
int gr = (2*n % 256);
int b = (n % 256);
g << r << " " << gr << " " << b << " ";
}
g << endl;
if(i == imageHeight / 2) break;
}
cout << "Finished!" << endl;
double stop = clock();
cout << (stop-start)/CLOCKS_PER_SEC;
return 0;
}
我一直到imageHeight / 2,因为在Photoshop中我可以复制另一半.
我在考虑loghartimic的力量,但尝试了一些东西,只适用于整数…
最佳答案 所以这是热循环:
int i = 0;
double zr = 0.0, zi = 0.0;
while (i < max_iterations && zr * zr + zi * zi < 4.0)
{
double temp = zr * zr - zi * zi + cr;
zi = 2.0 * zr * zi + ci;
zr = temp;
++i;
}
return i;
我知道如何在快速CPU指令中实现非整数功率但它不会让你脱离绑定,因为它根本不适用于复数.也不会使用std :: complex帮助.您不会为非内联支付任何费用,当然也无法在您找到它们时应用优化.所以我能做的最好的就是:
int i = max_iterations;
double zr = 0.0, zi = 0.0;
do {
double temp = zr * zr - zi * zi + cr;
zi = 2.0 * zr * zi + ci;
zr = temp;
} while (--i && zr * zr + zi * zi < 4.0)
return max_iterations - i;
是的,我知道从循环中取出一个整数测试并没有太大的收获.我只发现了另一个优化器,你必须检查它是否真的更快:
int i = max_iterations;
double zr = 0.0, zi = 0.0;
do {
double tempr = zr * zr - zi * zi + cr;
double tempi = zr * zi;
zi = tempi + tempi + ci;
zr = tempr;
} while (--i && zr * zr + zi * zi < 4.0);
return max_iterations - i;
这就是所有人.