两个,也许是微不足道的问题:
真.我花了最后三天实现比std :: sort更快的东西,只是为了做到这一点.它应该是一个introsort,我怀疑它使用单个pivot版本quicksort里面.史诗失败.我的速度至少慢了两倍.
在我的痛苦中,我甚至复制粘贴其他 - 顶级 - 程序员代码.徒劳无功.我也对我的其他算法进行了基准测试...我的二进制搜索,以及upper_bound,lower_bound版本都被剥离了,实际上并没有用更少的指令.不过,它们的速度大约是其两倍.
我问,为什么,为什么,为什么?这引出了我的下一个问题......
当然,我想看看他们的消息来源!是否有可能编写比这些更有效的代码,或者我是否处于抽象级别与我的"简单"main.cpp,我无法达到STL库使用的优化?
我的意思是举例......让我们拿地图......这是简单的联想容器.文档说它是用红黑树实现的.现在......尝试实现我自己的红黑树是值得的,或者他们带着这种喜悦:-)远离我,我应该把我得到的所有数据都扔到地图容器中?
我希望这确实有意义.如果没有,请原谅我.
jal*_*alf 10
简短的回答是"如果可以编写更快的代码来执行相同的操作,那么标准库就已经完成了".
标准库是由聪明的人设计的,它成为C++的一部分的原因是其他聪明的人认为它是聪明的.从那时起,15年过去了,其他聪明的人试图采用这些规范并编写绝对最有效的代码来实现它们.
这是你想要与之竞争的很多聪明.;)
所以STL中没有魔法,他们不会作弊,也不会使用你无法使用的技巧.它经过精心设计,可以最大限度地提高性能.
关于C++的事情是,它不是一种快速的语言.如果你不小心,很容易引入各种低效:虚函数调用,缓存未命中,过多的内存分配,不必要的对象复制,所有这些都会削弱C++代码的性能,如果你不小心的话.
小心,您可以编写与STL一样高效的代码.它并不那么特别.但总的来说,获得更快代码的唯一方法就是改变需求.标准库必须是通用的,以便在所有用例中尽可能地工作.如果您的要求更具体,有时可以编写有利于这些特定情况的专用代码.但是,在其他情况下,权衡是代码要么不起作用,要么效率低下.
最后一点是STL如此聪明的原因以及为什么它被采用到标准中的一个关键部分是,它几乎是零开销.许多语言的标准库"足够快",但不如手动代码快.他们有一个排序算法,但它并不像你自己就地编写它那么快.它可能会在常见的"对象"基类中使用一些强制转换,也可能在值类型上使用装箱.STL的设计使得几乎所有东西都可以由编译器内联,产生的代码相当于你自己手动编写的代码.它使用模板专门针对您正在使用的类型,因此转换为容器或算法所理解的类型没有任何开销.
这就是为什么很难与之竞争的原因.这是一个非常有效的图书馆,它必须是.根据普通C或C++程序员的心态,特别是10 - 15年前,如果它比原始阵列慢5%,那么没有人会使用std::vector它.没有人会使用迭代器和std算法,如果它们没有自己编写循环那么快.
因此,STL开创了许多聪明的C++技巧,以便与手动C代码一样高效.
| 归档时间: |
|
| 查看次数: |
411 次 |
| 最近记录: |