听到"高度优化的代码"或某些开发人员需要优化他们和诸如此类的东西,这是常见的.然而,作为一个自学成才的新程序员,我从来没有真正理解人们在谈论这些事情时究竟是什么意思.
关心一般的想法呢?此外,推荐一些阅读材料,无论你想在这件事上说什么.随意咆哮和讲道.
在*nix上分析C/C++应用程序的最佳工具是什么?
(我希望能够分析一个混合了(阻塞)文件IO,epoll for network和fork()/ execv()的服务器来解决一些繁重的问题;但是一般的帮助和更一般的工具都很受欢迎.)
您是否可以在一个概述中获得RAM,CPU,网络和磁盘的大系统图片,并深入研究它?
在内核列表上有很多关于类似事情的讨论perf timechart,但我还没有发现Ubuntu中出现过任何问题.
我正在试图找出如何配置WCF服务,以便我可以识别任何瓶颈.
我已经在网上找到了一些信息,但没有任何假设没有先前的知识,这就是我所处的位置.
推荐什么免费工具?
- visual studio tools
- clrprofiler
Run Code Online (Sandbox Code Playgroud)
以下是我发现使用vsperfcmd.exe来分析wcf服务的信息,根据这一点,它非常简单,但我需要填补从哪里开始的空白.我的假设是将VsPerfCLREnv和VsPerfCmd复制到托管我的wcf服务的服务器,并执行一些我不太确定的配置步骤.我也不太确定如何能够看到调用堆栈来评估每个调用的性能.
clrprofiler看起来有点简单.我假设我会将clrprofiler.exe复制到服务器,File->Profile Service并添加名称和启动/停止命令.(这是一个友好的名称或文件名或服务显示名称?)我假设我会对服务运行我的测试,我可以在clrprofiler中看到调用堆栈.这听起来不对吗?
[编辑]
我对测试网络并不感兴趣,因为这是在测试服务器上,这是一个大型wcf项目,上面有多个开发人员,我无法对项目进行更改,仅用于监控性能.我想专注于其中的实际方法的性能.
非常感谢任何入门帮助.
performance wcf instrumentation profiling visual-studio-2010
我正在编写一个小程序,必须对一个大型数组(最多400万个文本字符串)进行排序.似乎我在这方面做得很好,因为radixsort和mergesort的组合已经将原始q(uick)排序执行时间减少了不到一半.
执行时间是主要的一点,因为这是我用来对我的代码进行基准测试的.
我的问题是:
是否有更好的(即更可靠的)基准测试程序的方式,而不仅仅是执行的时间?它有点工作,但是如果运行两次,相同的程序(运行相同的后台进程)通常具有稍微不同的执行时间.
这有点挫败了检测小改进的目的.一些小的改进可能会增加一个很大的...
提前感谢任何输入!
结果:
我设法让gprof在Windows下工作(使用gcc和MinGW).与我的普通编译器(tcc)相比,gcc表现不佳(考虑执行时间),但它给了我很多洞察力.
我正在尝试优化应用程序上的几个瓶颈,该应用程序应该运行在各种各样的CPU和架构上(其中一些非常接近嵌入式设备).
然而,由于我的CPU速度,我的分析器的结果并不是很重要.有没有办法(最好是在Windows或Mac OS X下)限制我的CPU速度以进行性能分析?
我曾考虑使用虚拟机,但没有发现任何具有此类功能的虚拟机.
我来自Matlab背景,所以我习惯了一个分析器,它可以描述每一行而不仅仅是每个函数都像gprof或callgrind.有没有C类似功能的探查器?
谢谢!

这个问题恰逢其时,因为我也在努力优化.我知道R中不同的"正常"优化程序,我知道像雪,降雪,Rmpi等喜欢的并行包.然而,我没有设法在我的计算机上并行运行优化.
一些玩具代码说明:
f <- function(x) sum((x-1:length(x))^2)
a <- 1:5
optim(a,f)
nlm(f,a)
Run Code Online (Sandbox Code Playgroud)
我想要做的是并行化optim()函数(或nlm()函数,它基本相同).我的真实函数f()要复杂得多,一个优化循环持续大约半小时.如果我想运行100个样本的模拟,那个需要很长时间.我想避免为并行计算编写自己的牛顿算法,所以我希望有人能给我一些关于如何在R中使用并行计算来解决复杂优化问题的提示.
我认为这个问题与相关问题的问题不同.我的请求专门针对并行计算,而非一些更快的替代优化.
我正在考虑在一个计算密集的程序上使用Scala.对我们代码的C++版本进行概要分析表明,我们可以从Lazy评估中获益.我已经在Scala 2.9.1中尝试过并且非常喜欢它.但是,当我通过反编译器运行该类时,实现看起来并不正确.我假设它是反编译器的神器,但我想得到一个更确定的答案......
考虑以下简单的例子:
class TrivialAngle(radians : Double)
{
lazy val sin = math.sin(radians)
}
Run Code Online (Sandbox Code Playgroud)
当我反编译它,我得到这个:
import scala.ScalaObject;
import scala.math.package.;
import scala.reflect.ScalaSignature;
@ScalaSignature(bytes="omitted")
public class TrivialAngle
implements ScalaObject
{
private final double radians;
private double sin;
public volatile int bitmap$0;
public double sin()
{
if ((this.bitmap$0 & 0x1) == 0);
synchronized (this)
{
if (
(this.bitmap$0 & 0x1) == 0)
{
this.sin = package..MODULE$.sin(this.radians);
this.bitmap$0 |= 1;
}
return this.sin;
}
}
public TrivialAngle(double radians)
{
}
}
Run Code Online (Sandbox Code Playgroud)
对我来说,返回区块位于错误的位置,您将始终获得锁定.这不是真正的代码所做的,但我无法证实这一点.任何人都可以确认或否认我有一个虚假的反编译,并且懒惰的实现有点合理(即,只有在计算值时才锁定,并且不会为后续调用获取锁定?)
谢谢!
作为参考,这是我使用的反编译器: …
performance synchronization decompiling scala lazy-evaluation
在汇编指令级别分析代码时,如果现代CPU不按顺序或按顺序执行指令,那么指令指针的位置真正意味着什么呢?例如,假设以下x64汇编代码:
mov RAX, [RBX]; // Assume a cache miss here.
mov RSI, [RBX + RCX]; // Another cache miss.
xor R8, R8;
add RDX, RAX; // Dependent on the load into RAX.
add RDI, RSI; // Dependent on the load into RSI.
Run Code Online (Sandbox Code Playgroud)
指令指针大部分时间用在哪条指令上?我可以为所有人想出好的论点:
mov RAX, [RBX] 大概需要100个周期,因为这是一个缓存未命中.mov RSI, [RBX + RCX]也需要100个周期,但可能与前一个指令并行执行.它甚至意味着指令指针位于其中一个或另一个上?xor R8, R8 可能在内存加载完成之前执行乱序并完成,但指令指针可能会保留在此处,直到所有先前的指令也完成为止.add RDX, RAX生成管道停顿,因为它RAX是在缓慢的缓存未命中加载之后实际使用值的指令.add RDI, RSI也停滞,因为它依赖于负载RSI.我正在审查一个大的Java应用程序,看看是否有任何性能瓶颈.真正的问题是我无法确定任何单个模块的性能问题.整个应用程序都很慢.
我可以使用一些工具/技术来帮助我吗?