目前我正在开发一个 C# DLL,用于本机 C++ 应用程序。由于我的 DLL 的初始化相当慢,我想在那里做一些分析。基本上我想知道我的 DLL 中的哪些方法被调用的顺序和频率。
一种方法是使用调试器单步调试代码。但这需要很长时间;-) 我宁愿有某种列表来显示我的哪个方法被调用的频率。
有什么办法可以自动获得这个(不改变我的代码)?甚至可能没有第三方工具,如分析器等?
我在编译C++代码时安装了Google perftools(google-perftools 1.7-1ubuntu1),并将-lprofiler添加到R中的PKG_LIBS.
library(RcppArmadillo)
library(Rcpp)
Sys.setenv("PKG_CXXFLAGS"="-fopenmp")
Sys.setenv("PKG_LIBS"="-fopenmp -lprofiler")
sourceCpp('my.cpp')
Run Code Online (Sandbox Code Playgroud)
输出是:
/usr/bin/ld: cannot find -lprofiler
collect2: ld returned 1 exit status
make: *** [sourceCpp_17496.so] Error 1
g++ -I/usr/share/R/include -DNDEBUG -I"/usr/local/lib/R/site-library/Rcpp/include" -I"/usr/local/lib/R/site-library/RcppArmadillo/include" -fopenmp -fpic -g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Wformat-security -Werror=format-security -D_FORTIFY_SOURCE=2 -g -c my.cpp -o my.o g++ -shared -Wl,-Bsymbolic-functions -Wl,-z,relro -o sourceCpp_17496.so my.o -llapack -lblas -lgfortran -lm -lquadmath -fopenmp -fopenmp -lprofiler -L/usr/lib/R/lib -lR
Error in sourceCpp("my.cpp") :
Error 1 occurred building shared library.
WARNING: The tools required to build C++ code …Run Code Online (Sandbox Code Playgroud) 我正在使用gperftools来分析我的C代码.因此,我无法使用pprof应用程序分析配置文件.
$ gcc -g prog.c -o prog -lprofiler
$ export CPUPROFILE=info.prof
$ ./prog
Inside main()
Inside func1
Inside new_func1()
Inside func2
PROFILE: interrupts/evictions/bytes = 1133/0/300
$ ls
info.prof prog prog.c
$ ls -lah info.prof
-rw-rw-r-- 1 mm mm 2.6K Jun 6 09:36 info.prof
$ pprof info.prof prog
Reading Profile files in profile.*
Error: Could not open profile.0.0.0: No such file or directory
profile.ftab: No such file or directory
$
Run Code Online (Sandbox Code Playgroud)
我错了什么?什么是profile.ftab文件?
我正在使用 nvprof 来分析某些东西(包括 CPU 工作和 GPU 工作,即我使用 nvprof 标记等),并且我得到了 nvprof 生成的二进制文件。我可以将这些导入到 NVVP(NVidia Visual Profiler;Linux 版本)中,只需稍加努力,就可以将其保存到 XML 中。
但是...... XML 不包含有关我的各种 CPU 何时执行的计时数据。它提到了他们的存在,但没有更多。此外,XML 的末尾有这个二进制 blob,可能是 Base64 编码或其他东西,位于 PDM 标记内。我不清楚那里是否有任何帮助。
我阅读了 OpenCL 中的全局内存优化。在其中一个幻灯片中,使用了一个非常简单的内核(如下)来演示内存合并的重要性。
__kernel void measure(__global float* idata, __global float* odata, int offset) {
int xid = get_global_id(0) + offset;
odata[xid] = idata[xid];
}
Run Code Online (Sandbox Code Playgroud)
请参阅我下面的代码,它测量内核的运行时间
ret = clFinish(command_queue);
size_t local_item_size = MAX_THREADS;
size_t global_item_size = INPUTSIZE;
struct timeval t0,t1;
gettimeofday(&t0, 0 );
//ret = clFinish(command_queue);
ret = clEnqueueNDRangeKernel(command_queue, measure, 1, NULL,
&global_item_size, &local_item_size, 0, NULL, NULL);
ret = clFlush(command_queue);
ret = clFinish(command_queue);
gettimeofday(&t1,0);
double elapsed = (t1.tv_sec-t0.tv_sec)*1000000 + (t1.tv_usec-t0.tv_usec);
printf("time taken = %lf microseconds\n", elapsed);
Run Code Online (Sandbox Code Playgroud)
我传输了大约 0.5 GB 的数据:
#define …Run Code Online (Sandbox Code Playgroud) 我有一个Java进程,并使用以下选项启动它(如此处建议:FR的参数):
-XX:+ UnlockCommercialFeatures -XX:+ FlightRecorder -XX:StartFlightRecording =持续时间= 2m,文件名= myflightrecord.jfr -XX:FlightRecorderOptions =最大大小= 100k,最大= 1m
为了获得飞行记录器信息。
我希望maxage = 1m只会给我一分钟的记录,而maxsize = 100k的文件大小不会大于100Kb,但是它们都没有按预期工作。
我遇到的另一个问题是我希望文件每次存储一次,假设每分钟存储一次。但是文件“ myflightrecord.jfr ”是空的,直到达到持续时间(在示例中为2 分钟)。
有什么方法可以在持续时间结束之前使飞行记录器冲洗?
ps:我使用的Java版本是JDK1.8.0_45
我正在分析用C编写的一些数字代码(profiler是Instruments,编译器clang在Mac OSX 10.11.6上).多达77.3%的运行时间用于_platform_memmove$VARIANT$Haswell.
在汇编输出中,上面的函数被调用DYLD-STUB$$memcpy.但是,memcpy我的C代码中没有(我确实有一些代码malloc).
更进一步,似乎汇编命令rep负责占用这么多时间.从这篇文章来看,似乎rep没有做任何有用的事情.为什么编译器会插入它?这memcpy是从哪里来的?
我也试过编译-g,但是_platform_memmove$VARIANT$Haswell几乎所有的时间都没有吞噬.
我正在Windows 7 Professional SP1上使用Visual Studio 2012(11.0.61219.00)Update 5。我想介绍一下NUnit测试,该测试是我过去在不同系统上使用VS2010完成的。这是我第一次在此框上尝试此操作,此框具有相当新的VS2012安装。当我尝试使用Analyze | Profiler将分析器附加到正在运行的进程时 探查器| 附加/分离菜单选项,我得到一个对话框,其中包含以下错误消息:
无法加载文件或程序集“ VSPerfControl.Interop,版本= 11.0.0.0,区域性=中性,PublicKeyToken = b03f5f7f11d50a3a”或其依赖项之一。该系统找不到指定的文件。
我已经完成了以下诊断:
我还没有找到任何有用的信息,所以我希望这里的人可以帮助我找出问题所在。
更新:
该问题的最终解决方案可以在下面的helpfulPaul的评论中找到。
我试图使用perf工具来分析我的C++代码.实现包含带有SSE/AVX/AVX2指令的代码.除了该代码使用-O3 -mavx2 -march=native标志编译.我相信__memset_avx2_unaligned_erms函数是一个libc实现memset.perf表明这个功能有相当大的开销.函数名称表示内存未对齐,但在代码中我使用GCC内置宏显式对齐内存__attribute__((aligned (x)))可能是此函数有明显开销的原因以及为什么虽然内存明确对齐但调用了未对齐版本?