两个,也许是微不足道的问题:
真的。我在过去三天里实现了一些比 std::sort 更快的东西,只是为了这样做。它应该是一个 introsort,我怀疑它在内部使用了单枢轴版本的快速排序。史诗般的失败。我的至少慢了一倍。
在我极度的痛苦中,我什至复制粘贴了其他一流的程序员代码。徒劳无功。 我也对我的其他算法进行了基准测试……我的二进制搜索和 upper_bound、lower_bound 版本被精简到不能用更少的指令真正实现。不过,它们的速度大约是原来的两倍。
我问,为什么,为什么,为什么?这引出了我的下一个问题......
当然,我想看看他们的来源!是否有可能编写比这些代码更高效的代码,或者我是否处于抽象级别,我的“简单”main.cpp 无法达到 STL 库使用的优化?
我的意思是,例如...让我们以 map ...为例,它们是简单的关联容器。文档说它是用红黑树实现的。现在...是否值得尝试实现我自己的红黑树,或者他们带走了我的快乐:-),我应该把我得到的所有数据都扔到 map 容器中?
我希望这是有道理的。 如果不是,请见谅。
最佳答案
简短的回答是“如果可以编写更快的代码来做同样的事情,那么标准库早就可以做到了”。
标准库是由聪明人设计的,它成为 C++ 一部分的原因是其他聪明人认为它很聪明。从那时起,15 年过去了,其他聪明人试图采用这些规范并编写绝对最有效的代码来实现它们。
您要与之竞争的是很多聪明才智。 ;)
所以 STL 中没有魔法,他们不会作弊,也不会使用您无法使用的技巧。它经过精心设计以最大限度地提高性能。
C++ 本身并不是一种快速的语言。如果您不小心,很容易引入各种低效问题:虚函数调用、缓存未命中、过多的内存分配、不必要的对象复制,如果您不小心,所有这些都会削弱 C++ 代码的性能。
只要小心,您就可以编写与 STL 一样高效的代码。这不是特别的。但总的来说,要获得更快 代码的唯一方法是更改需求。标准库必须是通用的,以便在所有 用例中尽可能良好地工作。如果您的要求更具体,有时可以编写有利于这些特定情况的专门代码。但随后的权衡是,在其他情况下,代码要么不起作用,要么效率低下。
最后一点是,STL 之所以如此聪明并被纳入标准的一个关键部分是它几乎是零开销。许多语言的标准库“足够快”,但不如手写代码快。他们有一个排序算法,但速度不如您自己就地编写。它可能使用一些与公共(public)“对象”基类之间的转换,或者可能对值类型使用装箱。 STL 的设计使得几乎所有内容都可以由编译器内联,生成的代码相当于您自己手动编写的代码。它使用模板专门针对您正在使用的类型,因此没有转换为容器或算法可以理解的类型的开销。
这就是它难以与之竞争的原因。这是一个非常高效的图书馆,它必须如此。按照普通 C 或 C++ 程序员的心态,尤其是 10-15 年前,没有人会使用 std::vector 如果它比原始数组。没有人会使用迭代器和标准算法,如果它们不如自己编写循环那么快的话。
因此,STL 开创了许多聪明的 C++ 技巧,以便变得与手工编写的 C 代码一样高效。
关于C++ 标准库与凡人制作的代码 + 我在哪里可以找到源代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3680647/
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby
使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta
在rails源中:https://github.com/rails/rails/blob/master/activesupport/lib/active_support/lazy_load_hooks.rb可以看到以下内容@load_hooks=Hash.new{|h,k|h[k]=[]}在IRB中,它只是初始化一个空哈希。和做有什么区别@load_hooks=Hash.new 最佳答案 查看rubydocumentationforHashnew→new_hashclicktotogglesourcenew(obj)→new_has
查看Ruby的CSV库的文档,我非常确定这是可能且简单的。我只需要使用Ruby删除CSV文件的前三列,但我没有成功运行它。 最佳答案 csv_table=CSV.read(file_path_in,:headers=>true)csv_table.delete("header_name")csv_table.to_csv#=>ThenewCSVinstringformat检查CSV::Table文档:http://ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/CSV/Table.html
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
我发现ActiveRecord::Base.transaction在复杂方法中非常有效。我想知道是否可以在如下事务中从AWSS3上传/删除文件:S3Object.transactiondo#writeintofiles#raiseanexceptionend引发异常后,每个操作都应在S3上回滚。S3Object这可能吗?? 最佳答案 虽然S3API具有批量删除功能,但它不支持事务,因为每个删除操作都可以独立于其他操作成功/失败。该API不提供任何批量上传功能(通过PUT或POST),因此每个上传操作都是通过一个独立的API调用完成的
我的主要目标是能够完全理解我正在使用的库/gem。我尝试在Github上从头到尾阅读源代码,但这真的很难。我认为更有趣、更温和的踏脚石就是在使用时阅读每个库/gem方法的源代码。例如,我想知道RubyonRails中的redirect_to方法是如何工作的:如何查找redirect_to方法的源代码?我知道在pry中我可以执行类似show-methodmethod的操作,但我如何才能对Rails框架中的方法执行此操作?您对我如何更好地理解Gem及其API有什么建议吗?仅仅阅读源代码似乎真的很难,尤其是对于框架。谢谢! 最佳答案 Ru
我正在阅读SandiMetz的POODR,并且遇到了一个我不太了解的编码原则。这是代码:classBicycleattr_reader:size,:chain,:tire_sizedefinitialize(args={})@size=args[:size]||1@chain=args[:chain]||2@tire_size=args[:tire_size]||3post_initialize(args)endendclassMountainBike此代码将为其各自的属性输出1,2,3,4,5。我不明白的是查找方法。当一辆山地自行车被实例化时,因为它没有自己的initialize方法
我们的git存储库中目前有一个Gemfile。但是,有一个gem我只在我的环境中本地使用(我的团队不使用它)。为了使用它,我必须将它添加到我们的Gemfile中,但每次我checkout到我们的master/dev主分支时,由于与跟踪的gemfile冲突,我必须删除它。我想要的是类似Gemfile.local的东西,它将继承从Gemfile导入的gems,但也允许在那里导入新的gems以供使用只有我的机器。此文件将在.gitignore中被忽略。这可能吗? 最佳答案 设置BUNDLE_GEMFILE环境变量:BUNDLE_GEMFI