Gav*_*vin 46 c c++ performance boost glib
我有一种心理tic,这让我不愿意在C和C++等低级语言中使用大型库(如GLib或Boost).在我看来,我认为:
嗯,这个图书馆有数千个小时的时间,而且它是由那些比我更了解语言的人创造的.他们的作者和粉丝说这些库是快速可靠的,而且功能看起来非常有用,它肯定会阻止我(严重地)重新发明轮子.
该死的,我永远不会使用该库中的所有功能.它太大了,多年来可能会变得臃肿; 这是我的程序需要拖延的另一个球和链.
该托沃兹咆哮(争议虽然它是)不完全把我的心脏放心无论是.
我的想法有什么依据,还是我只是不合理和/或无知?即使我只使用大型库的一个或两个功能,通过链接到该库我会产生运行时性能开销吗?
我确信它还取决于具体的库是什么,但我通常很想知道大型库是否会在技术层面上固有地引入低效率.
当我没有技术知识知道我是否正确的时候,我已经厌倦了对此的痴迷,嘀咕和担心.
请把我从痛苦中解救出来!
gre*_*ade 30
即使我只使用大型库的一个或两个功能,通过链接到该库我会产生运行时性能开销吗?
一般来说,没有.
如果所讨论的库没有很多与位置无关的代码,那么当动态链接器在请求时对库执行重定位时,将会产生启动成本.通常,这是该计划启动的一部分.除此之外没有运行时性能影响.
链接器也擅长在构建时从静态链接库中删除"死代码",因此您使用的任何静态库都将具有最小的大小开销.性能甚至没有进入它.
坦率地说,你担心错误的事情.
Tim*_*sch 25
我无法对GLib发表评论,但请记住,Boost中的很多代码只是标题,并且考虑到用户的C++原则只支付他们正在使用的内容,这些库非常有效.有几个库需要你链接它们(想到正则表达式,文件系统等),但它们是独立的库.使用Boost,您不会链接到大型整体库,而只会链接到您使用的较小组件.
当然,另一个问题是 - 替代方案是什么?您是否希望在需要时自行实现Boost中的功能?鉴于许多非常称职的人员已经研究过这些代码并确保它能够在众多编译器中运行并且仍然有效,这可能不是一项简单的任务.另外,你至少在一定程度上重新发明了轮子.恕我直言,你可以更有成效地度过这段时间.
jal*_*alf 13
Boost不是一个很大的图书馆.
它是许多小型图书馆的集合.它们中的大多数都很小,它们被包含在一两个标题中.使用boost::noncopyable不会拖动boost::regex或boost::thread进入您的代码.他们是不同的图书馆.它们只是作为同一个库集合的一部分分发.但你只需为你使用的那些付费.
但总的来说,因为大型图书馆确实存在,即使Boost不是其中之一:
我的想法有什么依据,还是我只是不合理和/或无知?即使我只使用大型库的一个或两个功能,通过链接到该库我会产生运行时性能开销吗?
没有基础,或多或少.你可以自己测试一下.
编写一个小的C++程序并编译它.现在为它添加一个新函数,一个永远不会调用但定义的函数.再次编译程序.假设启用了优化,链接器会将其剥离,因为它未被使用.因此,包含其他未使用代码的成本为零.
当然,也有例外.如果代码实例化任何全局对象,那么可能不会删除这些对象(这就是为什么包含iostream头部会增加可执行文件的大小),但一般情况下,您可以包含任意数量的头文件并链接到任意数量的库,并且它不会只要您不使用任何添加的代码,就会影响程序的大小,性能或内存使用.
另一个例外是,如果动态链接到.dll或.so,则必须分发整个库,因此不能删除未使用的代码.但静态编译到您的可执行文件中的库(作为静态库(.lib或.a)或仅作为包含的头文件)通常可以由链接器修剪,删除未使用的符号.
P S*_*ved 11
从代码性能角度来看,大型库将会:
boost不需要运行时二进制文件,它们只是"标题").虽然操作系统只会将库中实际使用的部分加载到RAM,但它仍然可以加载超过您需要的数量,因为加载的粒度等于页面大小(仅在我的系统上为4 Kb).如果再次需要运行时二进制文件,则需要更多时间通过动态链接器加载.每次加载程序时,动态链接器必须将您需要外部库的每个函数与其在内存中的实际地址相匹配.这需要一些时间,但只是一点点(但是,它在加载许多程序的规模上很重要,例如桌面环境的启动,但你没有选择).
是的,每次调用共享(动态链接)库的外部函数时,它将在运行时进行一次额外的跳转和几次指针调整
从开发人员的绩效角度来看:
添加外部依赖项.你会依赖别人.即使该库的免费软件,您需要额外的费用来修改它.一些veeery低级程序开发人员(我说的是操作系统内核)讨厌依赖任何人 - 这是他们的专业特权.因此咆哮.
但是,这可以被认为是一种好处.如果其他人习惯了boost,他们会在你的程序中找到熟悉的概念和术语,并且会更有效地理解和修改它.
较大的库通常包含需要时间来理解的特定于库的概念.考虑Qt.它包含信号和插槽以及moc相关的基础设施.与整个Qt的大小相比,学习它们只需要一小部分时间.但如果你使用这么大的图书馆的一小部分,这可能是一个问题.
| 归档时间: |
|
| 查看次数: |
5316 次 |
| 最近记录: |