我在应用程序的“RelDebug”版本上运行 Visual Studio 2008 探查器。优化已开启,但内联程度适中,存在堆栈帧,并且发出符号。换句话说,RelDebug 是一个可以调试的、经过一定程度优化的构建(尽管有关检查变量的常见发行版警告适用)。
我在单独的运行中运行采样和仪器分析器。
结果?采样分析器产生的结果看起来很合理。然而,当我查看 Instrumented Profiler 结果时,我发现一些函数甚至不应该出现在列表顶部附近。
例如,像“SetFont”这样的函数仅由 1 行组成,用于将高度分配给类成员。或仅分配一个矩形的“SetClipRect”。
当然,我正在查看“独家”统计数据(即减去儿童)。
这发生在其他人身上吗?一旦我的应用程序增长到一定规模,这种情况似乎总是会发生。这使得仪表分析器在此时毫无用处。
我解决了这个问题。Visual Studio 2008 和 Visual Studio 2010 分析器都表现平平(委婉地说)。我购买了 Intel C++ Studio,它附带 vTune Amplifier(分析器)。在完全相同的代码上使用英特尔分析器,我能够获得真正有意义的分析器结果。
提高C代码性能的最不正统的方法是什么?这是无保留的!一切都包括将循环结构改为gotos,硬编码任何东西,以奇怪的方式使用案例陈述等.不要担心可维护性,可读性等.
ps这很实用......而且我很清楚如何以合理的方式提高代码的性能(在优化之前改进算法,配置文件等)
我有以下情况
bool user_set_flag;
getFlagFromUser(&user_set_flag);
while(1){
if(user_set_flag){
//do some computation and output
}
//do other computation
}
Run Code Online (Sandbox Code Playgroud)
该变量user_set_flag仅在代码中设置一次且仅一次,在开始时,其本质上是用户选择他想对程序执行的操作.假设用户选择user_set_flag = false然后编译器将以这样的方式编译代码,使得该if(user_set_flag)语句仅被检查一次,或者将始终被检查.我可以给编译器提示如将bool设置为const吗?
我问这个的原因是因为我的应用程序是时间关键的,它尽可能快地处理帧.一个总是错误的分支应该能够在运行时以某种方式确定?
我正在分析我简单的2D XNA游戏.我发现整个运行时间的4%是通过将两个颜色加在一起的简单操作来实现的,其中一个首先乘以浮点数.
我需要每帧调用这个方法rogulthy 2000次(对于地图上的每个tile),这给了我每秒120000次XNA的60 fps.即使是最小的单次呼叫提升也会产生巨大的速度影响.然而,我很简单,不知道如何才能使这更有效
private void DoColorCalcs(float factor, Color color)
{
int mul = (int)Math.Max(Math.Min(factor * 255.0, 255.0), 0.0);
tile.Color = new Color(
(byte)Math.Min(tile.Color.R + (color.R * mul / 255), 255),
(byte)Math.Min(tile.Color.G + (color.G * mul / 255), 255),
(byte)Math.Min(tile.Color.B + (color.B * mul / 255), 255));
}
Run Code Online (Sandbox Code Playgroud)
编辑:正如迈克尔斯图姆所建议的那样:
private void DoColorCalcs(float factor, Color color)
{
factor= (float)Math.Max(factor, 0.0);
tile.Color = new Color(
(byte)Math.Min(tile.Color.R + (color.R * factor), 255),
(byte)Math.Min(tile.Color.G + (color.G * factor), 255),
(byte)Math.Min(tile.Color.B + (color.B * …Run Code Online (Sandbox Code Playgroud) 在调用C中的标准字符串操作相关函数之前,是否有可用的指南?
例如,在调用strcmpprovide 之前,将比较两个字符串的第一个字符(并检查它们是否相等)进行多少优化?
可以预期C中与字符串相关的函数有哪些类型的开销,哪些机制有助于避免它们?
谢谢!
CPU进程的含义是什么意思?
如何衡量呢?
有什么方法可以减少它?
我一直对这个概念感到困惑.我试图在Linux中使用'top'命令来测量使用的CPU.但是,我注意到的是,当没有其他用户进程在运行时,我的进程似乎会在I/O中没有阻塞时占用99%的CPU.但是,如果还有其他进程在运行,则会达到45%或50%.当没有其他进程在运行时,进程占用99%的CPU是否可以接受?
方向上的任何链接或指针也会有所帮助.
最近,我的老板要求我提高应用程序的启动速度,AP是用C++编写的.AP有点大,它使用200+ dll,Windows需要很长时间才能进入main()函数.我试过这两种方式,但还是不能让老板开心.
还有其他方法可以改善它吗?提前致谢.
好吧,过去三天我一直坐在探查器结果面前,通过自动化套件运行各种各样的测试用例.我们的想法是看看是否有任何良好的优化通常可以提高性能.我有资格不错在这方面如下:
在最终用户级别具有非常重要和可观察的性能改进潜力,例如在表现不佳的领域中提高> 100%.
是否有可能减少核心空间使用,例如在数据繁重区域减少> 50%.
易于实现,对代码的混淆最少,副作用最小.即实施优化的好处大大超过了成本.
该应用程序是一个3D映射和建模包,在界面中有大量图形,后端有几何处理.我已经为确保大多数处理的最佳算法选择做了很多工作,而且在这个阶段我正在寻找任何通用的简单方法来处理大型和复杂的数据集时获得额外的优势.到目前为止,我已经提出以下建议;
搜索时,请保留最近找到的项目的缓冲区并首先检查.通过重复搜索进行的大量处理似乎在同一区域内进行搜索.从答案到现在,这似乎是一种特定的记忆形式
排序时,检查数据是否已按排序顺序排列(特别是在使用qsort的位置)
将GUI和处理保持在单独的线程中(失败是易于实现的良好标准,但IMO仍然值得)
如果你有本地类变量,它具有重要的构造/破坏时间,在使用频繁的成员函数中,使它们成为私有类成员.尤其是动态数组和字符串,尤其是MFC CArrays和CStrings.
使用动态数组时,将初始大小设置为略微超过典型使用量,并采用指数增长策略.
处理要存储在数组中的非常大的数据集时,首先调整数据大小以避免任何重新分配.
避免在堆栈上创建临时对象副本的函数返回,而是使用引用参数,例如
CString MyFunc(双x,双y)
效率低于
void MyFunc(double x, double y, CString &Result)
Run Code Online (Sandbox Code Playgroud)
实际上,避免CStrings和大多数MFC在代码的任何性能关键区域.(编辑:这可能更常被RVO否定,但不适用于我的应用中的CStrings)
这些项似乎在我的上下文中运行良好,但有没有明显的我遗漏的,或者还有其他优秀的资源优化?
编辑: 根据提供的许多评论,显然需要进一步解释.虽然我完全意识到建议对特定代码片段进行特定优化需要查看该代码,但过去几天花在分析分析器输出上已经显示出优化候选者方面的某些模式.我也意识到自己对其他人在这个领域做得很好的事情的无知,并且看到这些技术的列举清单(至少对我而言),无论它们是否适用于我的情况.这个问题不是关于优化的危险,但对于那里的任何初学者,我建议你首先建立一个强烈的需求,在首先考虑之前优化需求.我自己的偏好是根据未来的性能要求在设计阶段进行大多数优化,但我也是分析的强力倡导者,以验证在实施中是否满足设计假设.我会请人们取悦他们自己积极优化的经验,而不是他们是否应该首先考虑优化.
FWIW,编译器优化代码与否之间的区别在于我的自动化套件中的12%,这是最终用户级别的边界可观察.
第二次编辑:我发现一些相关的帖子非常有用,特别是Mike Dunlavey关于过度依赖于profiler输出的评论.
我被分配到性能调整 - 调试 - 故障排除任务.
场景:使用数据库在多台联网计算机上运行的多应用程序环境.操作系统是Unix,DB是Oracle.使用同步/异步通信跨应用程序实现业务逻辑.应用程序是多用户,在高峰时间有数百个呼叫中心用户.用户界面是基于Web的.
应用程序是第三方,我可以访问开发人员和源代码.我只有生产系统和功能测试环境,没有负载测试环境.
问题:性能不佳!我需要快速的结果.管理层疯了.
我得到了类似这样的症状示例:用户界面操作需要几分钟才能完成.为客户进行搜索通常需要6秒钟,但使用相同参数立即进行后续搜索可能需要6分钟.
找到根本原因的策略是什么?
像我们大多数人一样,我是提高代码效率的忠实粉丝.这么多,我宁愿选择快速执行的脏代码而不是更优雅或更干净但更慢的东西.
对我们所有人来说幸运的是,在大多数情况下,更快更有效的解决方案也是更清洁,最优雅的解决方案.我曾经只是编程的一个讨厌者,但我现在正在进行全职开发,刚开始使用C#和Web开发.我一直在阅读一些关于这些主题的好书,但遗憾的是,书籍很少涉及更精细的方面.比方说,执行相同操作的两个代码中的哪一个会运行得更快.这种知识主要来自经验.我要求所有程序员在这里分享任何这样的知识.
在这里,我将从我遇到的这两篇博文开始.这正是我在这篇文章中寻找的东西:
PS:如果这个东西已经存在于这个网站的某个地方,请告诉我.我惊讶地搜索但找不到.另外,请发布您知道的任何涵盖此类内容的书籍.
PPS:如果您从某些博客文章或我们都可以访问的某些在线资源中了解某些内容,那么最好发布链接本身imo.