如果您在真正对性能至关重要的领域中工作,那么您就不能不考虑效率问题。在这些情况下及早进行设计,并以与最终结果的可维护性相关的方式进行设计,这是最关键的事情之一。
您不能设计和实现大型服务器,而只是开始编写简单,文档完善的代码,而该代码仅对全局函数使用阻塞函数,而全局线程锁则锁定整个系统以处理每个单独的客户请求,而不会放置任何请求认为任何东西进入共享状态,线程争用和异步性。这是灾难的秘诀,并且需要重新设计和重写您编写的大量精美文档的代码,这些代码可能会导致可以想象的最难维护的代码库,而由于尝试而导致竞争状况和死锁事后才可以达到所需的效率,而不是仅仅预先考虑有效,简单,可行的设计。
一个游戏开发团队投入了8个月的生产时间,其引擎在其最强大的32核硬件上仅以每秒2帧的速度运行,而每次屏幕忙碌时往往会停顿15秒钟,这不太可能立即获得可用的产品修复一个局部的热点。很有可能他们的设计是FUBAR,在某种程度上可以重新审视绘图板和设计变更,这些变更可以层叠到代码库的每个角落。
他曾与John Carmack讨论过如何将技术演示以每秒至少数百至数千帧的速度运行以将其集成到生产中。这并不是对效率的不健康追求。他预先知道游戏需要整体以30 FPS以上的速度运行,以使客户满意。结果,像软阴影系统这样的小方面不能以30 FPS的速度运行,否则整个游戏可能无法足够快地提供所需的实时反馈。在达到所需的效率之前,它是无法使用的。在对效率有根本要求的此类关键性能领域中,一种解决方案无法达到足够的速度实际上并不比根本不起作用的解决方案好,。而且,除非您事先就其效率进行了大量的思考,否则您将无法设计出一种高效的软阴影系统,该系统无法按实时游戏引擎的要求每秒运行数百至数千帧。实际上,在这种情况下,90%以上的工作都围绕效率而进行,因为提出一个软阴影系统很简单,该系统使用路径跟踪在每帧2小时的工作时间就可以正常工作,但是您不能指望对其进行调整以每秒数百帧的速度运行,而方法却没有完全不同的变化。
当效率是应用程序设计的基本部分时,您不能期望在事后了解中实现效率,而不会浪费比忽略它节省的时间更多的时间,因为您不能期望在事后了解中实现可行的设计。没有人说:“ 可以推迟到以后再考虑设计。只要很好地编写代码,以后您就可以提出适当的设计。” 但是,在对性能至关重要的体系结构中,如果您不对高效的设计进行过多的关注和思考,那么这就是您有效的工作。
现在,这并不意味着您必须立即对实现进行微调。有关实现的详细信息,如果不需要更改设计,在进行测量后,仍有很大的空间可以迭代到更快的解决方案,并且通常这是最有效的解决方案。但是在设计级别,这确实意味着您必须从一开始就充分考虑设计和体系结构与效率之间的关系。
这里的关键区别是设计。在事后看来,对设计进行大的更改并不容易,因为设计会累积依赖关系,如果设计发生更改,依赖关系就会中断。而且,如果某个设计要求具有合理的效率,或者在某些情况下,其质量在很大程度上取决于其效率,那么您不应该期望事后才能够实现正确的设计。对于效率是质量至关重要的竞争产品,无论是操作系统,编译器,视频处理器,光线跟踪器,游戏引擎还是物理引擎,从一开始就认真考虑了效率和数据表示的思想。在那种情况下,将太多的思想放在效率的前面并不是过早的优化。正是在最有生产力的时候将这样的想法付诸实践