我即将使用JProfiler和Eclipse Tptp进行java应用程序的研讨会分析,性能调优,内存分析,内存泄漏检测等. 我需要一些练习,我可以提供给参与者,他们可以:使用工具来分析发现问题:瓶颈,内存泄漏,次优代码等.我相信有丰富的经验和现实生活中的例子.
问题和解决方案不应过于复杂; 应该可以在几分钟内解决它们,最坏的情况是几小时.一些有趣的锻炼领域:
理想情况下,练习应包括样本未优化代码和解决方案代码.
我正在编写一个非常重要的性能代码部分,我有一个关于用函数指针数组替换case语句(或if语句)的疯狂想法.
让我来证明一下; 这是正常版本:
while(statement)
{
/* 'option' changes on every iteration */
switch(option)
{
case 0: /* simple task */ break;
case 1: /* simple task */ break;
case 2: /* simple task */ break;
case 3: /* simple task */ break;
}
}
Run Code Online (Sandbox Code Playgroud)
这里是"回调函数"版本:
void task0(void) {
/* simple task */
}
void task1(void) {
/* simple task */
}
void task2(void) {
/* simple task */
}
void task3(void) {
/* simple task */
}
void (*task[4]) (void); …Run Code Online (Sandbox Code Playgroud) 在分析我的反向传播算法后,我了解到它负责占用我60%的计算时间.在我开始研究并行替代方案之前,我想看看我能做些什么.
该activate(const double input[])功能仅被占用约5%的时间.该gradient(const double input)功能实现如下:
inline double gradient(const double input) { return (1 - (input * input)); }
Run Code Online (Sandbox Code Playgroud)
有问题的培训功能:
void train(const vector<double>& data, const vector<double>& desired, const double learn_rate, const double momentum) {
this->activate(data);
this->calculate_error(desired);
// adjust weights for layers
const auto n_layers = this->config.size();
const auto adjustment = (1 - momentum) * learn_rate;
for (size_t i = 1; i < n_layers; ++i) {
const auto& inputs = i - 1 > 0 …Run Code Online (Sandbox Code Playgroud) 我试图通过去除我不关心的噪音和计算来描述(使用Callgrind)我的代码的特定部分.这是我想要做的一个例子:
for (int i=0; i<maxSample; ++i) {
//Prepare data to be processed...
//Method to be profiled with these data
//Post operation on the data
}
Run Code Online (Sandbox Code Playgroud)
我的用例是一个回归测试,我想确保所讨论的方法仍然足够快(类似于自上次实现以来少于10%的额外指令).这就是为什么我想从Callgrind获得更清晰的输出.(我需要一个for循环才能处理大量数据,以便对我想要分析的方法的行为有一个很好的估计)
我的第一次尝试是将代码更改为:
for (int i=0; i<maxSample; ++i) {
//Prepare data to be processed...
CALLGRIND_START_INSTRUMENTATION;
//Method to be profiled with these data
CALLGRIND_STOP_INSTRUMENTATION;
//Post operation on the data
}
CALLGRIND_DUMP_STATS;
Run Code Online (Sandbox Code Playgroud)
添加Callgrind宏来控制检测.我还添加了--instr-atstart = no选项,以确保我只分析我想要的部分代码...
不幸的是,当我开始使用callgrind启动我的可执行文件时,这种配置永远不会结束......这不是一个缓慢的问题,因为完整的仪器运行持续不到一分钟.
我也试过了
for (int i=0; i<maxSample; ++i) {
//Prepare data to be processed...
CALLGRIND_TOGGLE_COLLECT;
//Method to be profiled with these data
CALLGRIND_TOGGLE_COLLECT;
//Post …Run Code Online (Sandbox Code Playgroud) 如何按输出中的self列排序perf report?
$ perf --version
perf version 4.0.8-300.fc22.x86_64
$ uname -a
Linux marko-desktop 4.0.8-300.fc22.x86_64 #1 SMP Fri Jul 10 21:04:56 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
Run Code Online (Sandbox Code Playgroud)
数据是用
$ perf record -g -p $(pidof node)
Run Code Online (Sandbox Code Playgroud)
我在 VSCode 扩展、插件、google 中进行了一些搜索,但似乎没有给我提供与标准 VS 提供的类似工具。
有一个针对大型 VS 的完整代码分析器列表(仅 .NET 和托管 C++)。
使用“真正的”VisualStudio,您可以拥有非常先进的分析工具,支持 MSVS 支持的多种语言。
但我无法获得 VSCode 的任何信息。(是的,我找到了这个答案,但在我看来太复杂了。如果有任何带有 GUI 的东西,类似于 JavaScript 内置分析器,那就太棒了:)
请问有人知道 C#/C++/Java 的这种可能性吗?
目标:Linux 服务器,嵌入式 Linux,但我也可以在 Windows 上运行(仅 C# 代码)。
c# c++ performance-testing memory-profiling visual-studio-code
您使用哪些工具来确定代码的效率?您是否使用运行统计上大量测试的本土应用程序或某些商业产品?您是否使用自己的知识来测试代码的某些区域,或者使用某种工具来分析代码中的弱点?
我正在努力加快编译我的应用程序所花费的时间,而我正在调查的一件事是检查哪些资源,如果有的话,我可以添加到构建机器以加快速度.为此,我如何确定是否应该投入更多的CPU,更多的RAM,更好的硬盘或者该进程是否受到其他资源的约束?我已经看到了这个(如何检查应用程序是cpu绑定还是内存绑定?)并且我正在寻找更多提示和指针.
到目前为止我尝试过的:
在构建计算机上与本地计算机上的进程计时.我发现构建机器需要的时间是我的机器的两倍.
运行"资源监视器"并查看进程运行时的CPU使用率,内存使用情况和磁盘使用情况 - 在执行此操作时,我无法解释数字,主要是因为我不明白每个列的含义以及转换为虚拟机与物理盒以及多CPU盒的含义.
windows performance resources performancecounter virtual-machine
我有一个C++程序,它调用很多trig函数.它已经运行了一年多了.我最近安装了gcc-4.8,并且同样去了,更新了glibc.这导致我的程序减慢了几乎x1000倍.使用gdb我发现减速的原因是调用std :: tan().当参数是pi或pi/2时,该函数需要很长时间才能返回.
这是一个MWE,如果没有优化编译就会重现问题(真实程序在有和没有-O2标志的情况下都有相同的问题).
#include <cmath>
int main() {
double pi = 3.141592653589793;
double approxPi = 3.14159;
double ret = 0.;
for(int i = 0; i < 100000; ++i) ret = std::tan(pi); //Very slow
for(int i = 0; i < 100000; ++i) ret = std::tan(approxPi); //Not slow
}
Run Code Online (Sandbox Code Playgroud)
这是来自gdb的示例回溯(使用Ctrl + c随机中断程序后获得).从调用tan开始,回溯在MWE和我的真实程序中是相同的.
#0 0x00007ffff7b1d048 in __mul (p=32, z=0x7fffffffc740, y=0x7fffffffcb30, x=0x7fffffffc890) at ../sysdeps/ieee754/dbl-64/mpa.c:458
#1 __mul (x=0x7fffffffc890, y=0x7fffffffcb30, z=0x7fffffffc740, p=32) at ../sysdeps/ieee754/dbl-64/mpa.c:443
#2 0x00007ffff7b1e348 in cc32 (p=32, y=0x7fffffffc4a0, x=0x7fffffffbf60) at ../sysdeps/ieee754/dbl-64/sincos32.c:111 …Run Code Online (Sandbox Code Playgroud) c++ ×4
performance ×4
optimization ×3
profiling ×3
java ×2
linux ×2
c ×1
c# ×1
callback ×1
callgrind ×1
const ×1
gcc ×1
glibc ×1
if-statement ×1
memory-leaks ×1
perf ×1
profiler ×1
resources ×1
valgrind ×1
windows ×1