通常,如果我的代码有任何性能问题,我将按照以下步骤来了解原因.
如果您的代码运行速度很慢,您会怎么做?
我正在寻找一个简单的操作/例程,如果连续重复,可以"浪费"时间.
我正在研究如何将gprof配置文件应用程序,因此这个"浪费时间"需要在用户空间中浪费时间,并且不需要外部库.IE,调用sleep(20)将"浪费"20秒的时间,但gprof不会记录这次,因为它发生在另一个库中.
对于可以重复浪费时间的简单任务的任何建议?
我想从对象的角度来描述python代码.例如:
foo = Foo()
profiled_foo = add_profiling(foo)
# use profiled_foo like foo
...
# later
profiled_foo.print_profile()
Run Code Online (Sandbox Code Playgroud)
我希望按方法调用每个方法花费的累计时间.我没有发现任何类似的东西,虽然我认为写起来不应该太难.
这样的图书馆存在吗?或者也许不是因为这种方式分析会是一个坏主意?
根据Paul McGuire的回答:
import inspect
from time import sleep
from profilehooks import profile
class Foo(object):
def a(self):
sleep(0.1)
def b(self):
sleep(0.3)
def c(self):
sleep(0.5)
def add_profiling(obj):
for k in dir(obj):
attr = getattr(obj, k)
if inspect.ismethod(attr) and k != '__init__':
setattr(obj, k, profile(attr))
if __name__ == '__main__':
foo = Foo()
add_profiling(foo)
foo.a()
foo.a()
foo.b()
foo.b()
foo.a()
foo.c()
Run Code Online (Sandbox Code Playgroud)
.
*** PROFILER RESULTS ***
c …Run Code Online (Sandbox Code Playgroud) 我一直在使用 oprofile 来尝试找出为什么我的程序在内核中花费如此多的时间。我现在拥有来自内核的符号,但显然我的程序和内核之间没有链接可以告诉我程序的哪些部分花费了这么长时间。
samples % image name app name symbol name
-------------------------------------------------------------------------------
201 0.8911 vmlinux-3.0.0-30-generic vmlinux-3.0.0-30-generic _raw_spin_lock_irq
746 3.3073 vmlinux-3.0.0-30-generic vmlinux-3.0.0-30-generic rb_get_reader_page
5000 22.1671 vmlinux-3.0.0-30-generic vmlinux-3.0.0-30-generic default_spin_lock_flags
16575 73.4838 vmlinux-3.0.0-30-generic vmlinux-3.0.0-30-generic _raw_spin_lock
22469 11.1862 vmlinux-3.0.0-30-generic vmlinux-3.0.0-30-generic __ticket_spin_lock
22469 99.6010 vmlinux-3.0.0-30-generic vmlinux-3.0.0-30-generic __ticket_spin_lock [self]
26 0.1153 vmlinux-3.0.0-30-generic vmlinux-3.0.0-30-generic ret_from_intr
Run Code Online (Sandbox Code Playgroud)
我该去哪里?如何发现程序中导致 __ticket_spin_lock 的位置?
TC++ PL中的一个练习要求:
编写一个函数,该函数返回一个值或根据参数抛出该值.测量两种方式之间的运行时差异.
很遗憾他从未解释过如何衡量这些事情.我不确定我是否想要编写简单的"时间开始,时间结束"计数器,还是有更有效和实用的方法?
我最近一直在研究一个点云播放器,理想情况下应该能够从激光雷达捕获中可视化地形数据点并以大约30fps的顺序显示它们.然而,我似乎已经因PCI-e IO而陷入困境.
我需要为每一帧做的是加载存储在内存中的大点云,然后根据高度计算颜色图(我使用的东西类似于matlab的喷射图),然后将数据传输到GPU.这适用于云捕获,点数<100万.然而,在大约200万点时,这开始减慢到每秒30帧以下.我意识到这是很多数据(每点200万帧*[每点3个浮点数+每个颜色点3个浮点数]*每个浮点数4个字节*每秒30帧=每秒约1.34千兆字节)
我的渲染代码现在看起来像这样:
glPointSize(ptSize);
glEnableClientState(GL_VERTEX_ARRAY);
if(colorflag) {
glEnableClientState(GL_COLOR_ARRAY);
} else {
glDisableClientState(GL_COLOR_ARRAY);
glColor3f(1,1,1);
}
glBindBuffer(GL_ARRAY_BUFFER, vbobj[VERT_OBJ]);
glBufferData(GL_ARRAY_BUFFER, cloudSize, vertData, GL_STREAM_DRAW);
glVertexPointer(3, GL_FLOAT, 0, 0);
glBindBuffer(GL_ARRAY_BUFFER, vbobj[COLOR_OBJ]);
glBufferData(GL_ARRAY_BUFFER, cloudSize, colorData, GL_STREAM_DRAW);
glColorPointer(3, GL_FLOAT, 0, 0);
glDrawArrays(GL_POINTS, 0, numPoints);
glDisableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
glBindBuffer(GL_ARRAY_BUFFER, 0);
Run Code Online (Sandbox Code Playgroud)
每帧都会更改vertData和colorData的指针.
我希望能够做到的是,即使以后使用每帧可能达到700万点的大点云,也能够以每秒至少30帧的速度播放.这甚至可能吗?或者也许更容易网格化并构建高度图并以某种方式显示它?我对3D编程还很陌生,所以任何建议都会受到赞赏.
我对Visual Studio Profiler的性能分析印象深刻.快速为我的目的和易于使用.
我很想知道visual studio profiler中的警告.是否有更好的Windows应用程序分析器,这些注意事项更好?
我在剖析中是个假人,请告诉我你的人如何分析你的申请.哪一个更好,分析整个应用程序或隔离?如果选择是隔离你如何做到这一点?
我有一个Ruby程序,大约需要4分钟才能完成任务,我想把它降到1分钟以下.
我尝试了宝石中的ruby-prof,但是它使运行时间增加到约30分钟,甚至看起来都没有特别好地保持单调性(一些变化可靠地提高了性能 - 使用剖析器并且可靠地降低了性能 - 没有剖析器).此任务也无法真正分解为可以独立进行有意义分析的部分.
目前以最低开销分析Ruby代码的最佳方法是什么?
我使用OSX,但如果由于任何原因,探测器需要另一个操作系统,我可能会重新启动.
编辑:perftools.rb具有更低的开销,但结果看起来相当可疑诚实,超出任何合理的抽样错误 - 至少它必须搞乱GC或i/o缓冲或类似的东西,导致很多愚蠢的错误归因.它仍然击败了ruby-prof.
我会保持问题公开,万一有人知道比这更好的事情.
我可以使用哪些免费工具来测试Linux中C++代码的性能?基本上我想确定代码的瓶颈并提高性能.我的应用程序主要涉及使用来自网络的数据的计算代码.所以我想提高代码的执行速度.
谢谢.