我有一个在Linux上运行的C++应用程序,我正在优化它.如何确定代码的哪些区域运行缓慢?
在我们的应用程序的Linux版本中,我需要一个用于嵌入式探查器的高分辨率计时器.我们的分析器测量的范围与单个功能一样小,因此它需要一个优于25纳秒的定时器精度.
以前我们的实现使用内联汇编和rdtsc操作直接从CPU查询高频定时器,但这是有问题的,需要经常重新校准.
所以我尝试使用该clock_gettime函数来查询CLOCK_PROCESS_CPUTIME_ID.文档声称这给了我纳秒时间,但我发现单次调用的开销clock_gettime()超过250ns.这使得不可能将事件计时100ns,并且在计时器功能上具有如此高的开销会严重降低应用程序性能,从而扭曲配置文件超出值.(我们每秒有数十万个分析节点.)
有没有办法调用clock_gettime()开销小于¼μs?或者是否有其他方法可以可靠地获得时间戳计数器,开销<25ns?还是我坚持使用rdtsc?
下面是我过去常用的代码clock_gettime().
// calls gettimeofday() to return wall-clock time in seconds:
extern double Get_FloatTime();
enum { TESTRUNS = 1024*1024*4 };
// time the high-frequency timer against the wall clock
{
double fa = Get_FloatTime();
timespec spec;
clock_getres( CLOCK_PROCESS_CPUTIME_ID, &spec );
printf("CLOCK_PROCESS_CPUTIME_ID resolution: %ld sec %ld nano\n",
spec.tv_sec, spec.tv_nsec );
for ( int i = 0 ; i < TESTRUNS ; ++ i …Run Code Online (Sandbox Code Playgroud) 编写Bespin(基于云的基于画布的代码编辑器[以及更多])的人最近谈到了他们如何重新考虑和优化Bespin代码的一部分,因为他们误以为JavaScript很慢.事实证明,当所有的说法和完成时,他们的优化没有产生显着的改进.
我相信我们很多人都会根据类似于Bespin团队的误解编写"优化"代码.
开发人员通常订阅的常见性能瓶颈误区是什么?
我想在C++中配置一个dll插件.我有访问源(即作者/ mantainer),并可以对其进行修改(如果需要的仪器).我没有的是调用dll的主机程序的源/符号/等.我只有构建插件所需的标题.根据客户端的操作调用dll.
进行分析代码的最佳方法是什么?围绕dll"包装"可执行文件是不现实的,因为在插件中我从主机调用一些函数并且我需要对这些路径进行分析,因此包装器会使性能产生偏差.
在Kieren Johnston评论之后编辑:理想情况下,我想挂钩到加载的dll,就像调试器能够(附加到正在运行的主机进程并根据需要在dll中的某处放置断点).可能吗?如果没有,我将需要问另一个问题,问为什么:-)
我正在使用Visual Studio 2010的TFS版本.
在AIX下为同一任务提供建议/答案的奖励点(啊,多个环境的乐趣!).
我正在使用QLinkedList存储我写的一些类.
事实是我必须在这个列表上进行很多迭代.
很多我的意思是我编写的程序进行无限演算(好吧,你仍然可以手动停止它),我需要通过每次迭代的QLinkedList.
问题不在于我是否在这个列表上进行了多次迭代.
这是我正在分析我的代码,我发现1/4的时间花在QLinkedList :: end()和QLinkedList :: begin()函数上.
我的代码如下:
typedef QLinkedList<Particle*> ParticlesList; // Particle is a custom class
ParticlesList* parts = // assign a QLinkedList
for (ParticlesList::const_iterator itp = parts->begin(); itp != parts->end(); ++itp)
{
//make some calculus
}
Run Code Online (Sandbox Code Playgroud)
就像我说的那样,这段代码经常被调用,它花了很多时间在parts-> begin()和parts-> end()上.
那么,问题是如何减少这个列表迭代所花费的时间?
这里有一些我想过的解决方案,请帮我选择最好的或者再提一个:)
Particle** parts = // assing it something
for (int n = 0; n < LENGTH; …Run Code Online (Sandbox Code Playgroud) 警告:我不是要更好的代码,我是要为 HackerRank 提供更短的代码,只是为了了解可以做些什么来缩短它。
我是 Java 新手,正在尝试这个 FizzBuzz 问题:
编写一个程序,打印从 1 到 100 的数字。但是对于 3 的倍数打印 >“Fizz”而不是数字,对于 5 的倍数打印“Buzz”。对于 > 是三和五的倍数的数字,打印“FizzBuzz”。
我尽可能短地写了我的解决方案。
class Solution{
public static void main(String[]b){
for(int i=1;i<101;i++){
String a=(i%3==0)?(i%5==0)?"FizzBuzz":"Fizz":(i%5==0)?"Buzz":i+"";
System.out.println(a);}}}
Run Code Online (Sandbox Code Playgroud)
我得了 3.6 分。但显然还有改进的空间,因为有些人写的少了 27 个字符。这怎么可能?有什么建议?我真的不在乎排名,我只是想知道我错过了什么。
编辑:所以在你的帮助下,我做到了:
class Solution{public static void main(String[]b){for(int i=1;i<101;i++){System.out.println((i%3==0)?(i%5==0)?"FizzBuzz":"Fizz":(i%5==0)?"Buzz":i);}}}
Run Code Online (Sandbox Code Playgroud)
似乎我摆脱了 14 个字符。天知道其他人做了什么,又失去了 13 个角色。不管怎样,谢谢。