我正在测试一个计算Mandelbrot分形的简单代码.我一直在检查它的性能,具体取决于函数中的迭代次数,它检查一个点是否属于Mandelbrot集.令人惊讶的是,在添加-fPIC旗帜后,我的时间差异很大.从我读到的开销通常可以忽略不计,我遇到的最高开销约为6%.我大约30%.任何建议将被认真考虑!
我使用-O3标志,gcc 4.7.2,Ubuntu 12.04.2,x86_64.结果如下
#iter C (fPIC) C C/C(fPIC)
1 0.01 0.01 1.00
100 0.04 0.03 0.75
200 0.06 0.04 0.67
500 0.15 0.1 0.67
1000 0.28 0.19 0.68
2000 0.56 0.37 0.66
4000 1.11 0.72 0.65
8000 2.21 1.47 0.67
16000 4.42 2.88 0.65
32000 8.8 5.77 0.66
64000 17.6 11.53 0.66
我使用的命令:
gcc -O3 -fPIC fractalMain.c fractal.c -o ffpic
gcc -O3 fractalMain.c fractal.c -o f
Run Code Online (Sandbox Code Playgroud)
#include <time.h>
#include <stdio.h>
#include <stdbool.h> …Run Code Online (Sandbox Code Playgroud) 执行时,程序将从虚拟地址0x80482c0开始运行.此地址不指向我们的main()过程,而是指向_start由链接器创建的名为的过程.
到目前为止,我的谷歌研究只是让我得到了一些(含糊的)历史猜测:
有民间传说,0x08048000曾经是由加利福尼亚州圣克鲁斯市的一个团体颁布的*NIX到i386的端口上的STACK_TOP(也就是说,堆栈从接近0x08048000下降到0).这是因为128MB的RAM很昂贵,4GB的RAM是不可想象的.
任何人都可以确认/否认这个吗?