很多时候我使用优化代码(有时甚至涉及矢量化循环),其中包含错误等.如何调试这样的代码?我正在寻找任何类型的工具或技术.我使用以下(可能是过时的)工具,所以我想升级.
我使用以下内容:
谢谢
我目前正在开发一种非常快速的算法,其中一部分是极快的扫描和统计功能.在这个任务中,我追求任何性能优势.因此,我也有兴趣保持代码"多线程"友好.
现在的问题是:我注意到将一些非常频繁访问的变量和数组放入"全局"或"静态本地"(它们都是相同的),有一个可衡量的性能优势(在+ 10%的范围内) .我试图理解为什么,并找到一个解决方案,因为我宁愿避免使用这些类型的分配.请注意,我不认为差异来自"分配",因为在堆栈上分配一些变量和小数组几乎是瞬间完成的.我相信差异来自"访问"和"修改"数据.
在这次搜索中,我发现了stackoverflow的这篇旧帖子: 全局变量的C++性能
但我对那里的答案感到非常失望.很少解释,大多是咆哮"你不应该这样做"(嘿,这不是问题!)和非常粗略的陈述,如'它不影响性能',这显然是不正确的,因为我用精确测量它基准工具.
如上所述,我正在寻找解释,并且,如果存在,则解决此问题.到目前为止,我已经感觉到计算本地(动态)变量的内存地址比全局(或本地静态)花费更多.也许类似于ADD操作差异.但这无助于找到解决方案......
在网站周围遇到代码高尔夫琐事之后,显然人们试图找到在字符,线条和总大小方面尽可能短的编写代码和算法的方法,即使这意味着写下这样的东西:
//Code by: job
//Topic: Code Golf - Collatz Conjecture
n=input()
while n>1:n=(n/2,n*3+1)[n%2];print n
Run Code Online (Sandbox Code Playgroud)
所以作为初学者,我开始怀疑尺寸是否真正重要:D
这显然是一个非常主观的问题,高度依赖于所使用的实际代码,但现实世界中的经验法则是什么.
在尺寸不重要的情况下,那么我们怎么不关注性能而不是尺寸呢?
可能重复:
在终止进程之前保存gmon.out
我正在尝试在Linux环境中分析服务器(可用的源代码.c代码).该服务器像Web服务器一样连续运行.我正在尝试使用gprof来配置服务器.如果服务器自行退出,则会生成gmon.out文件.我可以使用gprof和gmon.out来理解配置文件数据.现在问题是,这台服务器正在连续运行,等待传入的套接字连接,请求等.如果我终止此服务器,则不会生成gmon.out.此时我看到以下选项.
编辑:服务器是多进程服务器.在FreeBSD 7.2上运行
我敢肯定,人们之前已经解决了这些问题.我没能在SO或外面找到有用的信息.
我感谢人们的任何想法/解决方案.
谢谢一堆.
更新1:
不知怎的,我设法为valgrind获得端口.当我运行make时,我得到以下错误.
=> valgrind-stable-352.tar.gz doesn't seem to exist in /usr/obj/ports/distfiles/.
=> Attempting to fetch from ftp://ftp.FreeBSD.org/pub/FreeBSD/ports/distfiles/.
fetch: ftp://ftp.FreeBSD.org/pub/FreeBSD/ports/distfiles/valgrind-stable-352.tar.gz: File unavailable (e.g., file not found, no access)
=> Attempting to fetch from http://www.rabson.org/.
fetch: http://www.rabson.org/valgrind-stable-352.tar.gz: No address record
=> Couldn't fetch it - please try to retrieve this
=> port manually into /usr/obj/ports/distfiles/ and try again.
*** Error code 1
Run Code Online (Sandbox Code Playgroud)
我试图在网上找到valgrind-stable-352.tar.gz.我找到的所有链接都已死亡.
我在我的freebsd上安装了pstack,实现的pstack只提供堆栈跟踪.参考:http://sourceforge.net/projects/bsd-pstack/
我的理解是systemtap仅用于内核空间事件,仪器等. …
我正在开始编写Java库来实现高性能的有限状态机.我知道那里有很多库,但是我想从头开始编写自己的库,因为几乎所有的库都构建了自动机,这些自动机被优化为一次只处理一个.
我想知道SO社区中涉及状态机设计的人员在实现像这样的高性能库时最重要/最好的设计原则是什么.
注意事项
目前关于设计的当前问题是:
应该上课State,Symbol并Transition定义?或者应该使用"隐藏的"内部结构.我个人认为使用类本会浪费大量内存,因为相同的信息可以以更加浓缩的形式存储.但是,这是否可以实现更快的转换?它是否有任何其他优点/缺点?
在内部存储数据的最佳方法是什么?使用类似的数据结构HashMap并HashSet启用分摊的常量时间查找,但是存在涉及的开销元素.这是最好的方法吗?将转换信息存储为原始(或非)数组似乎浪费了相当多的内存.特别是当库需要一次处理大量自动机时.不同数据结构的优缺点是什么?
我很感激任何意见.谢谢!
我已经读过很多开发人员使用x + = 1而不是x ++来清楚.我知道x ++对于新开发人员来说可能不明确,而且x + = 1总是更清晰,但两者之间的效率是否存在差异?
使用for循环的示例:
for(x = 0; x < 1000; x += 1) VS for(x = 0; x < 1000; x++)
我知道它通常不是那么大的交易,但如果我反复调用一个执行这种循环的函数,它可能会在长期内累加起来.
另一个例子:
while(x < 1000) {
someArray[x];
x += 1;
}
Run Code Online (Sandbox Code Playgroud)
VS
while(x < 1000) {
someArray[x++];
}
Run Code Online (Sandbox Code Playgroud)
可以用x + = 1代替x ++而不会造成任何性能损失吗? 我特别关注第二个例子,因为我使用两行而不是一行.
如何增加数组中的项?会someArray[i]++比someArray[i] += 1在大循环中完成时更快吗?
我已经尝试了所有可能的字段,但无法找到调用函数的次数.
此外,我没有得到Self和# Self.这两个数字是什么意思?
听到"高度优化的代码"或某些开发人员需要优化他们和诸如此类的东西,这是常见的.然而,作为一个自学成才的新程序员,我从来没有真正理解人们在谈论这些事情时究竟是什么意思.
关心一般的想法呢?此外,推荐一些阅读材料,无论你想在这件事上说什么.随意咆哮和讲道.
在*nix上分析C/C++应用程序的最佳工具是什么?
(我希望能够分析一个混合了(阻塞)文件IO,epoll for network和fork()/ execv()的服务器来解决一些繁重的问题;但是一般的帮助和更一般的工具都很受欢迎.)
您是否可以在一个概述中获得RAM,CPU,网络和磁盘的大系统图片,并深入研究它?
在内核列表上有很多关于类似事情的讨论perf timechart,但我还没有发现Ubuntu中出现过任何问题.
我读过Robert Martin的"清洁代码",它在80年代的Emacs中已经能够录制和播放你的编码会话.
我刚刚意识到我从这种练习中学到了多少,我很想了解自己!
但是我真的不认为录制屏幕(如视频)会非常有效,特别是因为Visual Studio已经无法忍受的速度慢,而且在播放器中寻找视频也很无聊.
相反,有一些插件可以记录我编码的内容(所以不是调试和视觉设计师等)真的很棒,并且可以回放给我看看我有多吮吸和在哪里.
这可能吗?
编辑:只是从书中引用,以显示这可能是多么有趣:
鲍勃进入模块.
他向下滚动到需要改变的功能.
考虑到他的选择,他停顿了一下.
哦,他正在向上滚动到模块的顶部以检查变量的初始化.
现在他向下滚动并开始输入.
哎呀,他正在抹掉他打字的东西!
他再次打字.
他再次擦掉它!
他输入了其他一半的东西但随后删除了!
他向下滚动到另一个函数,该函数调用他正在改变的函数以查看它是如何被调用的.
他向上滚动并键入他刚删除的相同代码.
他停顿了一下.
他再次删除了那段代码!
他弹出另一个窗口,看着一个子类.这个功能被覆盖了吗?
...
c ×4
performance ×4
profiling ×3
c++ ×2
optimization ×2
algorithm ×1
arrays ×1
benchmarking ×1
debugging ×1
disassembly ×1
fsm ×1
global ×1
gprof ×1
increment ×1
instruments ×1
ios ×1
java ×1
keylogger ×1
linux ×1
macos ×1
static ×1
theory ×1
unix ×1
xcode ×1