我正在为我的 n-body 模拟器优化我的代码,在分析我的代码时,我看到了这个:
这两行,
float diffX = (pNode->CenterOfMassx - pBody->posX);
float diffY = (pNode->CenterOfMassy - pBody->posY);
pNode 是指向我定义的 Node 类型对象的指针,并且包含(和其他东西)2 个 float ,CenterOfMassx 和 CenterOfMassy
其中 pBody 是指向我定义的 Body 类型对象的指针,并且包含(和其他东西)2 个 float ,posX 和 posY。
应该花费相同的时间,但没有。实际上第一行占函数样本的0.46%,而第二行占5.20%。
现在我可以看到第二行有 3 条指令,而第一行只有一条。
我的问题是,为什么这些看似做同样的事情,但实际上却做不同的事情?
最佳答案
如前所述,探查器仅在第一行列出一个汇编指令,但在第二行列出三个。但是,因为优化器可以大量移动代码,所以这不是很有意义。看起来代码被优化为首先将所有值加载到寄存器中,然后执行减法。所以它从第一行执行一个 Action ,然后从第二行执行一个 Action (加载),然后是第一行的一个 Action 和第二行的一个 Action (减法)。由于这很难表示,因此在显示与代码内联的反汇编时,它只是对哪一行对应于哪条汇编代码做了最好的近似。
请注意,第一个加载已执行,并且在执行下一个加载指令时可能仍在 CPU 流水线中。第二次加载不依赖于第一次加载中使用的寄存器。但是,第一个减法会。该指令要求先前的加载指令在流水线中足够远,以便结果可以用作减法的操作数之一。这可能会导致 CPU 停顿,而管道让加载完成。
所有这些确实强化了内存优化在现代 CPU 上比 CPU 优化更重要的概念。例如,如果您提前 15 条指令将所需值加载到寄存器中,则减法可能会发生得更快。
通常,您可以为优化做的最好的事情是让缓存与您将要使用的内存保持同步,并确保它尽快更新,而不是在需要内存之前。除此之外,优化复杂。
当然,现代 CPU 可能会为 out of order execution. 提前 40-60 条指令,所有这一切都变得更加复杂。
要进一步优化这一点,您可以考虑使用以优化方式执行 vector 和矩阵运算的库。使用这些库之一,可能会使用两个 vector 指令而不是 4 个标量指令。
关于c++ - 相同的操作需要不同的时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31175023/
当我使用Bundler时,是否需要在我的Gemfile中将其列为依赖项?毕竟,我的代码中有些地方需要它。例如,当我进行Bundler设置时:require"bundler/setup" 最佳答案 没有。您可以尝试,但首先您必须用鞋带将自己抬离地面。 关于ruby-我需要将Bundler本身添加到Gemfile中吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/4758609/
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
我注意到像bundler这样的项目在每个specfile中执行requirespec_helper我还注意到rspec使用选项--require,它允许您在引导rspec时要求一个文件。您还可以将其添加到.rspec文件中,因此只要您运行不带参数的rspec就会添加它。使用上述方法有什么缺点可以解释为什么像bundler这样的项目选择在每个规范文件中都需要spec_helper吗? 最佳答案 我不在Bundler上工作,所以我不能直接谈论他们的做法。并非所有项目都checkin.rspec文件。原因是这个文件,通常按照当前的惯例,只
我实际上是在尝试使用RVM在我的OSX10.7.5上更新ruby,并在输入以下命令后:rvminstallruby我得到了以下回复:Searchingforbinaryrubies,thismighttakesometime.Checkingrequirementsforosx.Installingrequirementsforosx.Updatingsystem.......Errorrunning'requirements_osx_brew_update_systemruby-2.0.0-p247',pleaseread/Users/username/.rvm/log/138121
我有一个这样的哈希数组:[{:foo=>2,:date=>Sat,01Sep2014},{:foo2=>2,:date=>Sat,02Sep2014},{:foo3=>3,:date=>Sat,01Sep2014},{:foo4=>4,:date=>Sat,03Sep2014},{:foo5=>5,:date=>Sat,02Sep2014}]如果:date相同,我想合并哈希值。我对上面数组的期望是:[{:foo=>2,:foo3=>3,:date=>Sat,01Sep2014},{:foo2=>2,:foo5=>5:date=>Sat,02Sep2014},{:foo4=>4,:dat
我需要检查DateTime是否采用有效的ISO8601格式。喜欢:#iso8601?我检查了ruby是否有特定方法,但没有找到。目前我正在使用date.iso8601==date来检查这个。有什么好的方法吗?编辑解释我的环境,并改变问题的范围。因此,我的项目将使用jsapiFullCalendar,这就是我需要iso8601字符串格式的原因。我想知道更好或正确的方法是什么,以正确的格式将日期保存在数据库中,或者让ActiveRecord完成它们的工作并在我需要时间信息时对其进行操作。 最佳答案 我不太明白你的问题。我假设您想检查
这个问题在这里已经有了答案:Railsformattingdate(4个答案)关闭4年前。我想格式化Time.Now函数以显示YYYY-MM-DDHH:MM:SS而不是:“2018-03-0909:47:19+0000”该函数需要放在时间中.现在功能。require‘roo’require‘roo-xls’require‘byebug’file_name=ARGV.first||“Template.xlsx”excel_file=Roo::Spreadsheet.open(“./#{file_name}“,extension::xlsx)xml=Nokogiri::XML::Build
我正在尝试解析一个CSV文件并使用SQL命令自动为其创建一个表。CSV中的第一行给出了列标题。但我需要推断每个列的类型。Ruby中是否有任何函数可以找到每个字段中内容的类型。例如,CSV行:"12012","Test","1233.22","12:21:22","10/10/2009"应该产生像这样的类型['integer','string','float','time','date']谢谢! 最佳答案 require'time'defto_something(str)if(num=Integer(str)rescueFloat(s
这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Rubysyntaxquestion:Rational(a,b)andRational.new!(a,b)我正在阅读ruby镐书,我对创建有理数的语法感到困惑。Rational(3,4)*Rational(1,2)产生=>3/8为什么Rational不需要new方法(我还注意到例如我可以在没有new方法的情况下创建字符串)?
如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是: