C++函数式编程(五)性能影响

原文:http://www.altdevblogaday.com/2012/04/26/functional-programming-in-c/

作者:John Carmack


-潘宏 译

-2013年1月

-email: popyy@netease.com

-weibo.com/panhong101


大多数情况下,直接操纵内存是最快的,否则肯定慢点。当然,大多时候也就这么说说而已,我们一直都为了赶进度而不顾性能。


编写纯函数会产生更多的数据拷贝,所以在一些要求性能的场合下,这种开发方法就不太合适。举个极端点的例子:把DrawTriangle()写成纯函数,传入一个帧缓冲作为参数,然后复制出一个新的帧缓冲,把三角形渲染到新缓冲上再返回。可千万别这么干。


按值返回是函数式编程的本性,但依赖编译器那不靠谱的返回值优化技术,性能怕是保证不了。所以对复杂数据来说,通过引用型参数实现输出比较合理,但这么做,就无法把该参数修饰为const,也就没法强制该参数成为单次赋值(Single Assignment)。


引用型参数和按值返回是函数的两个颇具争议的输出方式,修改引用会失去线程安全性,所以别轻易就这么做。列表生成是个对返回结果方式有利的证明,对此,纯函数的方法是将传入的列表拷贝一个新的,然后把元素添加到新列表之后并返回,原始列表保持不变。函数式语言在内部实现上擅长做这种事,但你胆敢用C++容器这么写的话就死定了。


还有一个要考虑的缓解因素就是:现今,提高性能就意味着并行编程,就算是在最优性能的情况下,它也会比单线程环境牵扯更多的数据拷贝与合并。这导致复制代价和复杂度降低,而正确率相应提高。当考虑游戏的运行状态,比如一个并行游戏世界中的所有角色时,我们就会发现用OO的方式来实现这种并行性难度极大。可能每个游戏对象开始只是引用一个只读的世界状态,但却需要在每帧结束后都拷贝一次更新后的世界对象...还是给我打住吧...

©️2020 CSDN 皮肤主题: 大白 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值