我正在测试一个计算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) https://msdn.microsoft.com/en-us/library/ms182161.aspx
此分页中描述的三个类是否在.NET Framework中专门处理?(NativeMethods,SafeNativeMethods和UnsafeNativeMethods)
我问的原因是我想知道是否可以创建NativeMethods类的类别.例如:
ComNativeMethods
User32NativeMethods
OleStorageNativeMethods
Run Code Online (Sandbox Code Playgroud) 我注意到我的C程序的性能差异很大,具体取决于-fPIC标志.当我使用它时,我的程序比没有它的程序慢约30%.我将它与一个调用C函数的Lua程序进行比较(所有繁重的计算都完成了).首先,我使用C函数创建了一个共享对象,因此必须使用-fPIC标志.性能与带有-fPIC标志的C代码非常相似.所以现在我试着没有.so:我从C调用了Lua:
int main()
{
lua_State* L = luaL_newstate();
luaL_openlibs(L);
lua_register(L, "my_c_function", my_c_function);
luaL_dofile(L, "my_lua_program.lua");
lua_close(L);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但是,无论我是否使用-fPIC标志(与使用.so的方法相同),这里的性能都是相同的.如果没有-fPIC标志,我期待一些改进...有关如何进一步调查的任何建议?第二种方法是否创建了与位置无关的代码,这就是性能相似的原因?谢谢!
更多信息,如评论所示:我使用-O3标志,gcc 4.7.2,Ubuntu 12.04.2,x86_64.是的,我对这么大的开销感到非常惊讶......我的程序正在计算Mandelbrot分形.所以有两个循环迭代x和y,我在C中的函数是isMandelbrot:它需要迭代次数并返回bool:属于Mandelbrot set或者不属于Mandelbrot.我将共享对象与'require'一起使用.
我正在尝试使用os.time()函数测量代码执行的时间,并使用LOVE框架显示它.但令我惊讶的是,显示的时间正在改变...我的代码是:
function foo()
start_time = os.time()
<some code>
end_time = os.time()
elapsed_time = os.difftime(end_time-start_time)
love.graphics.print('start time: ' .. start_time .. 's', 12, 12)
love.graphics.print('end time: ' .. end_time .. 's', 12, 22)
love.graphics.print('time elapsed: ' .. elapsed_time .. 's', 12, 32)
end
Run Code Online (Sandbox Code Playgroud)
当我打开窗口打开我的图形时,时间正在改变(开始和结束增长,差异在1和2之间变化) - 所以第一个问题是如果os.time()返回一个数字,会发生什么.而且 - 这是衡量我的应用程序执行时间的好方法吗?
我尝试使用谷歌测试框架,但不明白为什么出现以下代码:
TEST(MathTest, BelowZeroCandF)
{
EXPECT_DOUBLE_EQ(convertCtoF(-1), 30.2);
}
Run Code Online (Sandbox Code Playgroud)
在哪里
double convertCtoF(double c)
{
return 32+1.8*c;
}
Run Code Online (Sandbox Code Playgroud)
失败:
Failure
Value of: -30.20
Actual: -30.199999999999999
Expected: tc.convertCtoF(-1)
Which is: 30.199999999999999
[ FAILED ] MathTest.belowZeroCaboveZeroF (1 ms)
Run Code Online (Sandbox Code Playgroud)
我知道我可以使用 EXPECT_NEAR,但不明白为什么上面的方法不起作用......