任何在性能关键代码中使用过“双端队列”的人可能已经注意到(至少在 VS2010 附带的 STL 中) block 大小为 16 字节。这是 VS2010 附带的头文件的实际片段:
#define _DEQUESIZ (sizeof (value_type) <= 1 ? 16 \
: sizeof (value_type) <= 2 ? 8 \
: sizeof (value_type) <= 4 ? 4 \
: sizeof (value_type) <= 8 ? 2 \
: 1) /* elements per block (a power of 2) */
这不是新信息,请参阅 About deque<T>'s extra indirection有关此声明为何导致性能问题的更多详细信息。
我想在各种算法中使用双端队列,但如果我受限于此实现则不会。规避此问题的最佳方法是什么?
1) 使用另一个没有这个问题的容器。如果是这样,谁能给我指一个没有 GNU 许可限制的软件?
2) 创建一个新的容器类来解决这个限制。这个新的容器类不会成为 std 命名空间的一部分。
3) 编辑“deque”头文件中的_DEQUESIZ 定义。 IMO,我认为这是合法的,因为 _DEQUESIZ 的确切规范不是由 STL 定义的双端队列概念的一部分。
4) 向双端队列(以及关联的迭代器类)添加一个额外的模板参数,以允许在编译时指定 block 大小。此参数将默认为 _DEQUESIZ 的当前定义。我几乎拒绝这个解决方案,因为现在我使用这个 SCSS STL 的代码不可移植。
5) 游说大会更改 STL,这样我就可以愉快地使用“双端队列”而不会出现性能问题。 IMO,这可能比当前的财政悬崖辩论更成功。顺便说一句,我是加拿大人,所以整个众议院 + 参议院 + 总统的冗长乏味令人困惑。
最佳答案
不是真正的答案,但评论太长了:
如果您担心性能,我不建议您编写新的容器类。通常,STL 实现基于它们所针对的特定编译器的实现细节使用不可移植的优化,而您通常无法这样做。我曾经尝试自己重写一些非常简单的 STL 算法,并获得了大约一半的 STL 算法的执行速度。
更改 _DEQUESIZ 可能会在不可预见的地方导致性能问题,因为其他代码可能针对原始值进行了优化。再一次,当你为特定的编译器编写代码时,你可以做的那种不可移植的优化。不仅如此:您甚至可能会破坏一些取决于 _DEQUESIZ 的实际值的代码。
总而言之,在我看来,只有您的选项 1 是可行的。不幸的是,我不知道有什么好的选择;这就是为什么我写道这不是您问题的真正答案。
关于c++ - 处理导致性能问题的双端队列 block 大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13989835/
我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,
我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po
尝试通过RVM将RubyGems升级到版本1.8.10并出现此错误:$rvmrubygemslatestRemovingoldRubygemsfiles...Installingrubygems-1.8.10forruby-1.9.2-p180...ERROR:Errorrunning'GEM_PATH="/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/ruby-1.9.2-p180@global:/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/rub
Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
我有一些Ruby代码,如下所示:Something.createdo|x|x.foo=barend我想编写一个测试,它使用double代替block参数x,这样我就可以调用:x_double.should_receive(:foo).with("whatever").这可能吗? 最佳答案 specify'something'dox=doublex.should_receive(:foo=).with("whatever")Something.should_receive(:create).and_yield(x)#callthere
我的最终目标是安装当前版本的RubyonRails。我在OSXMountainLion上运行。到目前为止,这是我的过程:已安装的RVM$\curl-Lhttps://get.rvm.io|bash-sstable检查已知(我假设已批准)安装$rvmlistknown我看到当前的稳定版本可用[ruby-]2.0.0[-p247]输入命令安装$rvminstall2.0.0-p247注意:我也试过这些安装命令$rvminstallruby-2.0.0-p247$rvminstallruby=2.0.0-p247我很快就无处可去了。结果:$rvminstall2.0.0-p247Search
由于fast-stemmer的问题,我很难安装我想要的任何rubygem。我把我得到的错误放在下面。Buildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingfast-stemmer:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcreatingMakefilemake"DESTDIR="cleanmake"DESTDIR=
我在理解Enumerator.new方法的工作原理时遇到了一些困难。假设文档中的示例:fib=Enumerator.newdo|y|a=b=1loopdoy[1,1,2,3,5,8,13,21,34,55]循环中断条件在哪里,它如何知道循环应该迭代多少次(因为它没有任何明确的中断条件并且看起来像无限循环)? 最佳答案 Enumerator使用Fibers在内部。您的示例等效于:require'fiber'fiber=Fiber.newdoa=b=1loopdoFiber.yieldaa,b=b,a+bendend10.times.m
当我尝试安装Ruby时遇到此错误。我试过查看this和this但无济于事➜~brewinstallrubyWarning:YouareusingOSX10.12.Wedonotprovidesupportforthispre-releaseversion.Youmayencounterbuildfailuresorotherbreakages.Pleasecreatepull-requestsinsteadoffilingissues.==>Installingdependenciesforruby:readline,libyaml,makedepend==>Installingrub