我在StackOverflow上看到(并搜索过)关于过早优化的很多问题 - 街上的字是,它是所有邪恶的根源.:PI承认我经常犯这个罪; 我并没有真正以代码易读性为代价来优化速度,但我会使用似乎更适合任务的数据类型和方法以逻辑方式重写我的代码(例如在Actionscript 3中,使用类型化Vector而不是无类型数组对于迭代)如果我可以使我的代码更优雅,我会这样做.这通常有助于我理解我的代码,我通常知道为什么要进行这些更改.
无论如何,我今天在想 - 在OOP中,我们推动封装,试图隐藏实现并提升界面,以便类松散耦合.我们的想法是制作一些有用的东西,而不必知道内部发生了什么 - 黑匣子的想法.
因此,这是我的问题 - 尝试在类级别深入优化代码是明智的,因为OOP促进了模块化?或者这是否属于过早优化的范畴?我想,如果你使用一种容易支持单元测试的语言,你可以测试,测试和优化类,因为它本身就是一个接收输入并生成输出的模块.但是,作为一个编写代码的人,我不知道等待项目完全完成以开始优化是否更明智.
供参考:我以前从未在团队中工作过,所以对于有这种经历的开发人员来说显而易见的事情可能对我来说很陌生.
希望这个问题适合StackOverflow - 我没有找到另一个直接回答我的查询的问题.
谢谢!
编辑:思考这个问题,我意识到"剖析"可能是正确的术语,而不是"单元测试"; 单元测试检查模块是否正常工作,同时分析检查性能.另外,我之前应该问过的问题的一部分 - 在创建它们之后对各个模块进行概要分析,而不是在应用程序完成后减少时间分析?
我的问题源于我正在尝试的游戏开发 - 我必须创建应该以最佳方式执行的模块,例如图形引擎(它们是否会是一个不同的故事:D).在性能不太重要的应用程序中,我可能不会担心这一点.
我知道ASM基本上是最快的,但是HLL比抽象的ASM慢吗?抽象的意思是,例如在C++中你有一个类,需要存储关于类中存储的内容,它来自什么,私有/公共访问器和其他东西的数据.编译此代码时,是否有实际的汇编代码可以确定有关该类的信息?就像CPython是基于C构建的那样,在运行时运行时比C更多的抽象和指令.我说的是什么?我想我已经回答了我自己的问题,但我希望得到一个比我更有经验的人的回答.
编辑:我理解Python被解释但如果编译它不会比C慢吗?
关于如何进行低级Java优化有很多问题和答案以及意见,包括for,while和do-while循环,以及是否有必要.
我的问题更多的是基于高级别的设计优化.我们假设我必须做以下事情:
对于给定的字符串输入,计算字符串中每个字母的出现次数.
当字符串是几个句子时,这不是一个主要问题,但如果相反,我们想要计算900,000个单词文件中每个单词的出现.建设循环只是浪费时间.
那么什么是可以应用于此类问题的高级设计模式.
我想我的主要观点是我倾向于使用循环来解决许多问题,并且我想摆脱使用循环的习惯.
提前致谢
山姆
ps如果可能,你可以产生一些伪代码来解决900,000字的文件问题,我倾向于理解代码比我能理解英语更好,我认为对于这个网站的大多数访问者来说都是一样的
我想在C++中配置一个dll插件.我有访问源(即作者/ mantainer),并可以对其进行修改(如果需要的仪器).我没有的是调用dll的主机程序的源/符号/等.我只有构建插件所需的标题.根据客户端的操作调用dll.
进行分析代码的最佳方法是什么?围绕dll"包装"可执行文件是不现实的,因为在插件中我从主机调用一些函数并且我需要对这些路径进行分析,因此包装器会使性能产生偏差.
在Kieren Johnston评论之后编辑:理想情况下,我想挂钩到加载的dll,就像调试器能够(附加到正在运行的主机进程并根据需要在dll中的某处放置断点).可能吗?如果没有,我将需要问另一个问题,问为什么:-)
我正在使用Visual Studio 2010的TFS版本.
在AIX下为同一任务提供建议/答案的奖励点(啊,多个环境的乐趣!).
我是编程新手.我知道计算机按照给出的顺序执行指令.
我正在学习C,我写了这个:
#include <stdlib.h>
#include <stdio.h>
int comp(const char *a, const char *b) {
return *a - *b;
}
int main() {
char str[] = "Hello, world! I'm learning C and it's awesome!";
qsort(str, sizeof(str) - 1, sizeof(char), comp); // -1 because of NUL-terminator.
puts(str);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但是,当我想对多个非常大的数组进行排序时,这可能需要一段时间.我的计算机有多个处理核心,所以我想利用它.那可能吗?代码可以并行运行,我该怎么做?
PS我知道我必须在优化之前对代码进行分析,但是现在假设这是一个非常慢的操作.
我必须分析我的多线程 C++ 应用程序并找到它的瓶颈。问题是:我需要查看挂钟配置文件。我用过oprofile和perf。没有人可以向我提供这样的信息。
我使用过perf record -g -e sched:sched_stat_sleep <cmd>但因perf recordSIGFPE 异常而失败。这让我很生气。
Valgrind不适合我,因为我使用fanotify_mark了此工具中未实现的 syscall。
我不确定谷歌是否perftools可以进行挂钟分析 - 我在他们的文档中没有看到任何信息。
任何人都可以建议吗?谢谢你。
我想到构建一个基于专用硬件的综合工具,以加速RTL的开发.
我们的想法是进行vhdl/verilog/netlist合成器的引导,这是一个在HW中实现大型状态机的平台,它使所有RTL敏感(用自己的语言编写编译器显示了SW世界的近距离想法).
我正在寻找 MacOS 上 C++ 的代码分析/分析工具。我知道已经有关于这个线程的帖子,但是我需要的应用程序非常具体,所以也许有人可以给我一些更具体的建议。
所以这是我的问题:我正在用 C++ 编写科学代码(硕士项目),所以它是一个纯粹的控制台应用程序,没有给出交互性。该代码应该在大规模并行计算机上运行,因此我使用 MPI。然而,现在我还没有针对可扩展性进行优化,而只是针对单核性能进行优化。由于我不想将整个程序重写为串行程序,因此我只使用带有 1 个线程的 MPI。它工作得很好,但优化器显然需要能够处理这个问题。
我想分析什么?嗯,从某种意义上说,代码并不是很复杂,因为它有一个非常简单的结构,因此我需要的只是程序在某些函数上花费多长时间的列表,这样我就知道它在哪里损失了最多的时间,并且我可以测量我的优化速度加快了。
感谢所有的想法
我正在尝试使用分析来优化一个相当复杂的 C++ 项目(多个源文件,链接到 Boost 库、GSL 和 OpenCV)。使用 CMake,我首先编译
\n\nset(CMAKE_CXX_FLAGS " -O3 -ffast-math -fprofile-generate=profiling -pg -fopenmp ")\nRun Code Online (Sandbox Code Playgroud)\n\n使用典型输入运行生成的可执行文件后,我使用以下命令进行编译
\n\nset(CMAKE_CXX_FLAGS " -O3 -ffast-math -fprofile-use=profiling -fopenmp ")\nRun Code Online (Sandbox Code Playgroud)\n\n编译失败并出现大量错误,如下所示:
\n\n/n/user/projects/project_name/src/foo.cpp: In member function \xe2\x80\x98double TLinearInterp::operator()(double) const\xe2\x80\x99:\n/n/user/projects/project_name/src/foo.cpp:86:1: error: corrupted profile info: profile data is not flow-consistent\n }\n ^\n/n/user/projects/project_name/src/foo.cpp:86:1: error: corrupted profile info: number of executions for edge 2-7 thought to be -7232\n/n/user/projects/project_name/src/foo.cpp:86:1: error: corrupted profile info: number of executions for edge 2-3 thought to be 20996551\n/n/user/projects/project_name/src/foo.cpp:86:1: error: corrupted profile info: …Run Code Online (Sandbox Code Playgroud) 假设您有一个非常大的图形,其节点上有大量处理(每个节点有数百万个操作).每个节点的核心例程都是相同的,但是有一些基于内部条件的附加操作.可以有2个这样的条件产生4个案例(0,0),(1,0),(0,1),(1,1).例如(1,1)表示两种条件都成立.条件在程序中建立一次(每个节点独立设置一个),从那时起,永远不会改变.不幸的是,它们是在运行时以完全不可预测的方式确定的(基于通过HTTP和外部服务器接收的数据).
这种情况下最快的是什么?(考虑到我不知道的现代编译器优化)
我会花很长时间来达到可以自己测试的程度(我还没有这么大的数据,这将被集成到更大的项目中,因此不容易测试所有版本).
阅读答案:我知道我可能要试验它.但除了一切,这是一个更快的问题:
数百万的IF语句和正常的静态函数调用VS函数指针调用VS继承,我认为这不是最好的想法在这种情况下,我想从进一步的检查中消除它感谢任何建设性的答案(不是说我不应该关心这些小事;)
c++ ×5
performance ×4
profiling ×4
optimization ×3
algorithm ×2
c ×2
assembly ×1
bigdata ×1
class ×1
distributed ×1
dll ×1
g++ ×1
inheritance ×1
java ×1
linux ×1
macos ×1
mpi ×1
oop ×1
perf ×1
theory ×1
unit-testing ×1
verilog ×1
vhdl ×1