这个网站上已经存在很多性能问题,但是我发现几乎所有这些都是特定于问题且相当狭窄的问题.几乎所有人都重复这些建议,以避免过早优化.
我们假设:
我在这里寻找的是在一个关键算法中挤出最后几个百分点的策略和技巧,除此之外别无他法.
理想情况下,尝试使答案语言不可知,并在适用的情况下指出建议策略的任何缺点.
我将使用我自己的初步建议添加回复,并期待Stack Overflow社区可以想到的任何其他内容.
这绝对是主观的,但我想尽量避免它变得有争议.我认为如果人们适当地对待它可能是一个有趣的问题.
对这个问题的想法来自评论跟帖从我的回答到:"你恨你喜欢的语言什么的五件事?" 问题.我争辩说C#中的类应该默认密封 - 我不会把我的推理放在这个问题上,但我可以写一个更全面的解释作为这个问题的答案.我对评论中讨论的热度感到惊讶(目前有25条评论).
那么,你持有什么有争议的意见?我宁愿避免那种以相对较少的基础(例如括号放置)而变得非常宗教的东西,但是例子可能包括诸如"单元测试实际上并不十分有用"或"公共领域真的很好"之类的东西.重要的是(对我来说,无论如何)是你有理由支持你的意见.
请提出您的意见和推理 - 我鼓励人们投票支持有争议和有趣的意见,无论您是否恰好同意这些意见.
如果某个东西正在使单线程程序占用,比如10倍,那么就可以在其上运行一个分析器.您也可以通过"暂停"按钮暂停它,您将看到它正在做什么.
即使它比它应该慢了10%,如果你停止它多次,不久你会看到它反复做不必要的事情.通常问题是在堆栈中间某处不是真正需要的函数调用.这不能衡量问题,但确实找到了.
编辑:反对意见主要假设您只采取1个样本.如果你是认真的,请采取10.任何一行代码,导致一定比例的浪费,如40%,将平均出现在该部分样本的堆栈上.瓶颈(单线程代码)无法隐藏它.
编辑:为了表明我的意思,许多反对意见的形式是"没有足够的样本,所以你看到的可能完全是虚假的" - 关于机会的模糊观点.但是,如果任何可识别的描述,不仅仅是在常规或常规活动中,在30%的时间内有效,那么在任何给定样本上看到它的概率是30%.
然后假设只采集了10个样本.在10个样本中看到问题的次数遵循二项分布,并且看到它0次的概率是.028.看到它1次的概率是.121.2次,概率为.233,而3次则为.267,之后下降.由于看到它少于两次的概率是.028 + .121 = .139,这意味着看到它两次或更多次的概率是1 - .139 = .861.一般规则是,如果您看到可以修复两个或更多样本的内容,则值得修复.
在这种情况下,在10个样本中看到它的机会是86%.如果你是14%没有看到它的人,那就去做更多的样品.(如果样本数量增加到20,那么两次或多次观察的几率会增加到99%以上.)所以它没有经过精确测量,但已经准确找到了,重要的是要了解它它可能很容易成为分析器无法实际找到的东西,例如涉及数据状态的东西,而不是程序计数器.
我在C#中编写不可变二进制树的不同实现,我希望我的树从基类继承一些常用方法.
不幸的是,它从基类派生类是一败涂地缓慢.非派生类可以充分发挥作用.以下是两个几乎相同的AVL树实现,用于演示:
这两棵树具有完全相同的代码,但我在基类中移动了DerivedAvlTree.Insert方法.这是一个测试应用程序:
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using Juliet.Collections.Immutable;
namespace ConsoleApplication1
{
class Program
{
const int VALUE_COUNT = 5000;
static void Main(string[] args)
{
var avlTreeTimes = TimeIt(TestAvlTree);
var derivedAvlTreeTimes = TimeIt(TestDerivedAvlTree);
Console.WriteLine("avlTreeTimes: {0}, derivedAvlTreeTimes: {1}", avlTreeTimes, derivedAvlTreeTimes);
}
static double TimeIt(Func<int, int> f)
{
var seeds = new int[] { 314159265, 271828183, 231406926, 141421356, 161803399, 266514414, 15485867, 122949829, 198491329, 42 };
var …Run Code Online (Sandbox Code Playgroud) 我想在分析模式下在Linux服务器上运行java程序.
是否有任何分析工具可以在命令提示符下在Linux服务器上分析java程序?
我有一个Spring应用程序,我认为它有一些瓶颈,所以我想用一个分析器来运行它来测量哪些函数花了多少时间.有关我应该如何做的任何建议?
我正在运行STS,该项目是一个maven项目,我正在运行Spring 3.0.1
精简版:
是否有适合Linux的基于良好时间的采样分析器?
长版:
我通常使用OProfile来优化我的应用程序.我最近发现了一个令我疑惑的缺点.
问题是紧密循环,产生c ++ filt来解码c ++名称.在追逐另一个瓶颈时,我偶然偶然发现了代码.OProfile没有显示代码的任何异常,所以我几乎忽略了它,但我的代码意识告诉我优化调用,看看发生了什么.我将popenc ++ filt 更改为abi::__cxa_demangle.运行时间从一分多钟到一秒多一点.大约x60加速.
有没有办法我可以配置OProfile标记popen呼叫?随着配置文件数据的出现,现在OProfile认为瓶颈是堆和std::string调用(BTW一旦优化就将运行时间降低到不到一秒,超过x2加速).
这是我的OProfile配置:
$ sudo opcontrol --status
Daemon not running
Event 0: CPU_CLK_UNHALTED:90000:0:1:1
Separate options: library
vmlinux file: none
Image filter: /path/to/executable
Call-graph depth: 7
Buffer size: 65536
Run Code Online (Sandbox Code Playgroud)
还有另一个Linux的分析器可能找到了瓶颈吗?
我怀疑问题是OProfile只将其样本记录到当前正在运行的进程中.我希望它始终将其样本记录到我正在分析的过程中.因此,如果当前流程已被切换(阻止IO或popen呼叫),OProfile只会将其样本置于阻塞的呼叫中.
如果我无法修复此问题,OProfile仅在可执行文件接近100%CPU时才有用.它对于具有低效阻塞调用的可执行文件无能为力.
对于一些职业java程序员来说,这可能是一个愚蠢的问题,但我现在很生气,所以我仍然在问.请指导我正确的方向某人.
如何分析哪个方法/ partOfMethod在我的java程序中消耗更多时间?
(我正在使用Eclipse和Junit)
java ×3
performance ×3
profiling ×3
optimization ×2
c# ×1
c++ ×1
inheritance ×1
linux ×1
oprofile ×1
popen ×1
profiler ×1
spring ×1