我们有一个大的C++应用程序,有时我们需要作为调试版本运行以调查错误.调试版本比发布版本慢得多,几乎无法使用.
有哪些技巧可以使MSVC Debug构建执行得更快而不会牺牲太多的可调试性?
我有一个WPF应用程序,有时会冻结半分钟,然后工作正常.我正在考虑描述该应用程序.有谁知道如何配置WPF应用程序的好教程?或者任何人都想知道何时冻结?冻结不一致,与任何使用模式无关
感谢帮助.
加桑
我刚刚用c ++重写了一个matlab程序作为mex函数来加速,结果非常棒.这个优化决策是一个非常好的主意,在没有线程的情况下可以加速20倍.它仍然让我对mex-function花费时间和想要识别可能的瓶颈感到好奇.
我正在寻找一种分析mex功能的方法.matlab profiler用处不大,我下载的其他分析器(免费和试用版)都希望运行可执行文件.我不是mex-guru,但据我所知,运行mex的唯一方法是在Matlab中.mex-function被编译成一个dll,但被称为.mex64.所以这个问题应该类似于分析一个DLL.为了编写c ++ mex-function我使用的是单用户VS2005(即不是团队版本),而是在x64平台上运行.
有没有人知道配置mex功能的好方法?我应该使用什么工具,当我从Matlab开始时如何使用它?或者有没有其他方法来分析c ++代码?
我尝试使用valgrind来描述一个简单的c prog:
[zsun @ nel6005001~] $ valgrind --tool = memcheck ./fl.out
== 2238 == Memcheck,内存错误检测器
== 2238 == Copyright(C)2002-2009,GNU GPL'd,Julian西沃德等人.
== 2238 ==使用Valgrind-3.5.0和LibVEX; 重新运行-h版权信息
== 2238 ==命令:./ fl.out
== 2238 ==
== 2238 ==
== 2238 == HEAP SUMMARY:
== 2238 ==在退出时使用:1,168字节in 1个块
== 2238 ==总堆使用量:1个allocs,0个frees,1,168个字节分配
== 2238 ==
== 2238 == LEAK SUMMARY:
== 2238 ==绝对丢失:0个块中的0个字节
== 2238 = =间接丢失:0个块中的0个字节
== 2238 ==可能丢失:0个块中的0个字节
== 2238 ==仍然可达:1个块中的1,168个字节
== 2238 ==抑制:0个块中的0个字节
== 2238 ==重新运行--leak-check = full以查看泄漏内存的详细信息
== 2238 ==
== 2238 …
可能重复:
递归是否比循环更快?
大约15年前,我第一次接受C语言培训.我的雇主想要高度优化的代码来处理计算困难的任务.我记得不止一次被建议将递归重写为循环,即使是在昂贵的可读性方面,以避免"递归开销".正如我所理解的那样,递归开销是将数据推送到堆栈然后将其弹出所需的额外工作.
现在我用C,Python,Perl编写,有时用Java编写代码,我有时会想到递归.还有什么东西可以通过重写来获得吗?如果它们是尾递归怎么办?现代编译器让所有这些问题都没有实际意义吗?这些担忧是否与解释语言无关?
optimization recursion programming-languages tail-recursion interpreted-language
我已经将这个简单的方法从C#转换为C++.它读取路径表并填充整数列表(或整数向量的向量).
路径表中的示例行类似于
0 12 5 16 n
Run Code Online (Sandbox Code Playgroud)
我知道有一般这样做的更好的办法,但现在我只想知道为什么我的C++代码正在采取这么多的时间.例如10分钟而不是C#版本的10秒钟.这是我的C++代码.我猜我做的事情有点严重错误.
//Parses the text path vector into the engine
void Level::PopulatePathVectors(string pathTable)
{
// Read the file line by line.
ifstream myFile(pathTable);
for (unsigned int i = 0; i < nodes.size(); i++)
{
pathLookupVectors.push_back(vector<vector<int>>());
for (unsigned int j = 0; j < nodes.size(); j++)
{
string line;
if (getline(myFile, line)) //Enter if a line is read successfully
{
stringstream ss(line);
istream_iterator<int> begin(ss), end;
pathLookupVectors[i].push_back(vector<int>(begin, end));
}
}
}
myFile.close();
}
Run Code Online (Sandbox Code Playgroud)
这是C#版本: …
我想在更大的应用程序中改进特定方法的性能.
目标是改善延迟(在特定功能中花费的挂钟时间),而不是(必要的)系统负载.
要求:
迄今为止丢弃的工具:
我尚未进一步评估的其他选项:
我很想知道:
我终于安顿下来了:
这个粗糙工具产生的痕迹很难解释,我可以很容易地想象一些工具来进一步处理它的输出,使它更加有用.但是,这对我来说现在已经完成了这项工作,所以我把这个项目放到了以后;).
由于我的代码分析,我得到一个奇怪的输出.对于代码的主要计算,它正确地表明超过70%的时间花在这些部分上,但还有一些其他有趣的点.以下行占用%5.8
int counter = 0 ; // %5.8 of total time
Run Code Online (Sandbox Code Playgroud)
以下For循环消耗的时间较少(nx = 800&ny = 800)!这怎么可能?附上了剖析器结果的图片.

我发现的唯一的东西是EQATEC Profiler.是否还有其他可用于配置.NET CF应用程序的分析器?
我刚开始使用谷歌性能工具(google-perftools以及libgoogle-perftools4ubuntu中的软件包),我发誓我正在谷歌上搜索一天,我没有找到答案!问题是我没有通过CPU分析获得所有函数的结果.这是我的代码:
#include "gperftools/profiler.h"
#include <iostream>
#include <math.h>
using namespace std;
void bar()
{
int a,b,c,d,j,k;
a=0;
int z=0;
b = 1000;
while(z < b)
{
while (a < b)
{
d = sin(a);
c = cos(a);
j = tan(a);
k = tan(a);
k = d * c + j *k;
a++;
}
a = 0;
z++;
}
}
void foo()
{
cout << "hey " << endl;
}
int main()
{
ProfilerStart("/home/mohammad/gperf/dump.txt");
int a = 1000; …Run Code Online (Sandbox Code Playgroud) profiling ×5
performance ×3
c# ×2
c++ ×2
optimization ×2
.net ×1
debugging ×1
gperftools ×1
io ×1
linux ×1
matlab ×1
mex ×1
profiler ×1
recursion ×1
sampling ×1
trace ×1
valgrind ×1
visual-c++ ×1
wpf ×1