在观看Joshua Bloch的演出"表现焦虑"后,我阅读了他在"评估Java Pro fi lers的准确性"演讲中提出的论文.引用结论:
我们的结果是令人不安的,因为它们表明在我们的七个基准测试和两个生产JVM中大多数普遍存在的错误 - 并且显着 - 所有四个最先进的专业人员都会产生不正确的专业知识.不正确的配置文件很容易导致性能分析师花时间优化对性能影响最小的冷方法.我们表明,不使用屈服点进行采样的概念验证问题不会遇到上述问题
论文的结论是我们无法真正相信剖析器的结果.但是,使用分析器的替代方法是什么.我们应该回去,只是用我们的感觉做优化吗?
更新:讨论中似乎遗漏的一点是观察者效应.我们能否建立一个真正" 观察者效应 " 的探测器- 免费?
确定处理例程所需的时间(例如函数的过程)最好和最准确的方法是什么?
我问,因为我目前正在尝试优化我的应用程序中的一些函数,当我测试更改时,如果有任何改进,只需通过查看就很难确定.因此,如果我能够返回一个准确或接近准确的处理例程的时间,那么我可以更清楚地了解代码是否有任何变化.
我考虑过使用GetTickCount,但我不确定这是否接近准确?
有一个可恢复的函数/过程来计算例程的时间是有用的,并使用它像这样:
// < prepare for calcuation of code
...
ExecuteSomeCode; // < code to test
...
// < stop calcuating code and return time it took to process
Run Code Online (Sandbox Code Playgroud)
我期待听到一些建议.
谢谢.
克雷格.
这可能是一个边缘广告,更不用说主观,但问题是诚实的.在过去的两个月里,我一直在为.NET开发一个名为SlimTune Profiler的新开源分析器(http://code.google.com/p/slimtune/).
这是一项相对较新的努力,但当我查看可用的分析仪系列时,我并没有给人留下深刻的印象.我已经完成了一些基于现有产品的初步工作,但我觉得这是一个很好的问题:你究竟想从一个探查器得到什么?
我来自实时图形和游戏,因此对我来说,剖析器尽可能快.否则,游戏变得无法播放,并且分析无法播放的慢速游戏往往不会很有启发性.因此,我愿意牺牲一些准确性.我甚至不关心异常.但我不熟悉其他类型应用程序的开发人员感兴趣的内容.是否有适合您的创建或中断功能?现有工具在哪里倒下?
再一次,我很抱歉,如果这只是StackOverflow的基础,但它对我来说一直是一个非常有用的资源,这里有很多开发人员.
简短版本:我想知道标准三角函数的实现是否比包含的更快math.h.
龙版本:我有一个程序,对NUMERICS相当重(这是一个物理模拟),并需要调用三角函数,主要是sin和cos,有很多.目前我只是使用其中包含的实现math.h.分析显示对这些函数的调用花费比我预期的要多(希望).
虽然代码的其他部分肯定有足够的优化空间,但速度更快sin,cos可能会给我一些额外的百分比..那么,你们有什么建议吗?
在另一篇文章中,建议使用自制的查找表.但也许有其他选择?或者在一些图书馆中提供现成且经过良好测试的查找解决方
几年前,我参加了一个专家小组讨论相关高级嵌入式C程序员职位的候选人.
我问过的一个标准问题是优化技术.我很惊讶有些候选人没有答案.
因此,为了为后代制作一个列表,您在优化C程序时通常使用哪些技术和结构?
接受优化速度和大小的答案.
在ACM示例中,我必须构建一个用于动态编程的大表.我不得不在每个单元格中存储两个整数,所以我决定去找一个std::pair<int, int>.但是,分配大量的数组需要1.5秒:
std::pair<int, int> table[1001][1001];
Run Code Online (Sandbox Code Playgroud)
之后,我将此代码更改为
struct Cell {
int first;
int second;
}
Cell table[1001][1001];
Run Code Online (Sandbox Code Playgroud)
并且分配花了0秒.
是什么解释了这个巨大的时间差异?
我想完成这个人做的事情:
但是我需要优化它以超快速运行.简而言之,我想要一个时间序列,并告诉每次它越过零(改变符号).我想记录过零点之间的时间.由于这是真实的数据(32位浮点数),我怀疑我每个都有一个正好为零的数字,所以这并不重要.我目前有一个计时程序,所以我会把你的结果计算在内,看看谁赢了.
我的解决方案给出(微秒):
open data 8384
sign data 8123
zcd data 415466
Run Code Online (Sandbox Code Playgroud)
如您所见,过零检测器是缓慢的部分.这是我的代码.
import numpy, datetime
class timer():
def __init__(self):
self.t0 = datetime.datetime.now()
self.t = datetime.datetime.now()
def __call__(self,text='unknown'):
print text,'\t',(datetime.datetime.now()-self.t).microseconds
self.t=datetime.datetime.now()
def zcd(data,t):
sign_array=numpy.sign(data)
t('sign data')
out=[]
current = sign_array[0]
count=0
for i in sign_array[1:]:
if i!=current:
out.append(count)
current=i
count=0
else: count+=1
t('zcd data')
return out
def main():
t = timer()
data = numpy.fromfile('deci.dat',dtype=numpy.float32)
t('open data')
zcd(data,t)
if __name__=='__main__':
main()
Run Code Online (Sandbox Code Playgroud) C++风格与性能 - 使用C风格的东西,比一些C++等价物更快,这是不好的做法?例如:
不要使用atoi(),itoa(),atol()等!使用std::stringstream< - 有时可能更好,但总是如此?使用C函数有什么不好的?是的,C风格,而不是C++,但不管怎样?这是C++,我们一直在寻找性能..
永远不要使用原始指针,而是使用智能指针 - 好吧,它们真的很有用,每个人都知道,我知道,我一直使用它,我知道它们是多少更好的原始指针,但有时它是完全安全的使用原始指针..为什么不呢?"不是C++风格?< - 这够了吗?
不要使用按位操作 - 太C风格?WTH?为什么不,当你确定你在做什么?例如 - 不要按位交换变量(a ^= b; b ^= a; a ^= b;) - 使用标准的3步交换.不要使用左移乘以2.等等......(好吧,这不是C++风格与C风格,但仍然是"不好的做法")
最后,最昂贵的 - "不要使用enum-s来返回代码,它也是C风格,使用异常来处理不同的错误"?为什么?好吧,当我们谈论深层次的错误处理时 - 好的,但为什么总是?这有什么不对,例如 - 当我们谈论一个函数时,它返回不同的错误代码,当错误处理只在函数中实现时,它会调用第一个错误代码?我的意思是 - 不需要在上层传递错误代码.例外是相当缓慢的,它们是特殊情况的例外,而不是美丽.
等等等
好的,我知道良好的编码风格非常非常重要 < - 代码应该易于阅读和理解.我知道微优化并不需要,因为现代编译器非常智能,编译器优化非常强大.但我也知道异常处理有多昂贵,如何实现(某些)smart_pointers,并且一直没有需要smart_ptr ......例如,我知道这atoi不是那么"安全" std::stringstream,但仍然如此.那表现怎么样?
编辑:我不是在谈论一些非常困难的东西,它们只是C风格的特定.我的意思是 - 不要错过使用函数指针或虚拟方法以及C++程序员可能不知道的这些东西,如果从未使用过这类东西(而C程序员一直这样做).我正在谈论一些更常见和更容易的事情,例如在示例中.
我曾经使用过系统监视器应用程序中内置的漂亮的Apple探查器.只要您的C++代码是使用调试信息编译的,您就可以对正在运行的应用程序进行采样,并打印出一个缩进的树,告诉您父函数在此函数中花费的时间百分比(以及正文与其他函数调用) .
例如,如果main调用function_1and function_2,function_2调用function_3,然后是main调用function_3:
main (100%, 1% in function body):
function_1 (9%, 9% in function body):
function_2 (90%, 85% in function body):
function_3 (100%, 100% in function body)
function_3 (1%, 1% in function body)
Run Code Online (Sandbox Code Playgroud)
我会看到这一点,然后想一想,"有些东西需要花费很长时间function_2才能完成代码.如果我希望我的程序更快,那就是我应该开始的地方."
我怎样才能最轻松地获得Python程序的精确分析输出?
我见过有人说这样做:
import cProfile, pstats
prof = cProfile.Profile()
prof = prof.runctx("real_main(argv)", globals(), locals())
stats = pstats.Stats(prof)
stats.sort_stats("time") # Or cumulative
stats.print_stats(80) # 80 = how many to print
Run Code Online (Sandbox Code Playgroud)
但与优雅的呼叫树相比,它相当混乱.如果你能轻易做到这一点,请告诉我,这会有所帮助.
在我正在编写的软件中,我正在进行数百万乘法或除以2(或2的幂)的值.我真的希望这些值int能够访问bitshift运算符
int a = 1;
int b = a<<24
Run Code Online (Sandbox Code Playgroud)
但是,我不能,而且我必须坚持双打.
我的问题是:由于存在双精度(符号,指数,尾数)的标准表示,是否有一种方法可以与指数一起使用以2的幂来获得快速乘法/除法?
我甚至可以假设位数将被修复(该软件将在总是具有64位长的双倍的机器上工作)
PS:是的,该算法主要只执行这些操作.这是瓶颈(它已经是多线程的).
编辑:或者我完全错了,聪明的编译器已经为我优化了一些东西?
临时结果(用Qt测量时间,矫枉过正,但我不在乎):
#include <QtCore/QCoreApplication>
#include <QtCore/QElapsedTimer>
#include <QtCore/QDebug>
#include <iostream>
#include <math.h>
using namespace std;
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
while(true)
{
QElapsedTimer timer;
timer.start();
int n=100000000;
volatile double d=12.4;
volatile double D;
for(unsigned int i=0; i<n; ++i)
{
//D = d*32; // 200 ms
//D = d*(1<<5); // 200 ms
D = ldexp (d,5); // 6000 ms
} …Run Code Online (Sandbox Code Playgroud) performance ×6
c++ ×4
optimization ×4
c ×3
math ×2
profiler ×2
python ×2
.net ×1
c# ×1
coding-style ×1
delphi ×1
division ×1
gettickcount ×1
java ×1
numpy ×1
profiling ×1
std-pair ×1
tree ×1