C 如何处理内存限制&;流程的性能改进。
这实际上包含两个问题 1) 您得到了一个项目,该项目产生的代码不能满足环境的内存限制。你能做些什么来处理这件事 2) 你得到了一个项目,它的执行速度比预期的慢。你是怎么处理的 我能想到的答案是: 1) 尽可能多地使用std库,因为它们可能已经被加载,用函数模块化代码以避免重写可能节省堆栈空间的重复代码 2) 在必要时引入内联函数以减少函数查找开销,编译器优化可能是(如果不是,我使用的是volatile) 请给出尽可能多的解决方案:)1)根据需要动态加载和卸载模块 在Windows下,您可以使用C 如何处理内存限制&;流程的性能改进。,c,C,这实际上包含两个问题 1) 您得到了一个项目,该项目产生的代码不能满足环境的内存限制。你能做些什么来处理这件事 2) 你得到了一个项目,它的执行速度比预期的慢。你是怎么处理的 我能想到的答案是: 1) 尽可能多地使用std库,因为它们可能已经被加载,用函数模块化代码以避免重写可能节省堆栈空间的重复代码 2) 在必要时引入内联函数以减少函数查找开销,编译器优化可能是(如果不是,我使用的是volatile) 请给出尽可能多的解决方案:)1)根据需要动态加载和卸载模块 在Windows下,您可以使用L
LoadLibrary
和GetProcAddress
而不是实际链接到lib
文件。链接会导致dll
加载到内存中,即使未使用。使用LoadLibrary
可以在需要时加载它,这样它就不会占用内存,完成后再卸载
对于Linux,请参阅“使用libdl动态加载和卸载共享库”一节
2) 个人资料,当然。除非面试官特别要求微观优化技巧,否则这是正确的答案
90%
的总代码的20%
,然后针对该代码进行优化
1) 您得到了一个项目,该项目产生的代码不能满足环境的内存限制。你能做些什么来处理这件事
问题是“代码”不适合。。。如果按字面理解(即与堆栈、堆和静态/全局数据不同),则表示:
1) 一些可执行代码需要减小大小和/或
2) 需要减少并发加载的代码量,和/或
3) 这些限制需要取消
问题可能允许也可能不允许3)-检查限制。如果面试官鼓励你,那就从这里开始吧,因为这是一个简单的胜利:例如,你可以将16位进程重新编译为32位,或者为编译器/链接器指定不同的可执行布局,以增加支持的可执行大小吗?您是否可以通过分配更多的硬盘来交换空间而不遇到过度交换来增加虚拟地址空间
要减少代码大小,首先要测量代码大小:以总量和每个函数为基础。检查编译器开关以优化速度上的空间及其影响。在每个函数级别,关注最大的函数,以及大量类似函数加起来会产生大量可执行代码的任何情况。这些函数可以由嵌套宏生成,也可以由某些代码生成工具生成。尝试将通用算法分解为一个函数,该函数使用函数指针或运行时切换接受自定义
阅读最有问题的函数,了解膨胀的可能原因,例如它们调用大量时间的潜在内联函数。对于非常简单的操作,函数调用可能比内联代码差一点,但重复内联非平凡函数可能会造成任意更糟糕的代码膨胀。函数内部的预处理器宏扩展也是有效的内联
对于2)减少并发加载的代码,可以使用动态加载的库(例如,Linux/UNIX上的dlopen
/dlsym
/dlclose
)。这使您能够显式控制代码映射到进程地址空间的时间窗口。或者,您可以有效地序列化对部分代码的需求,例如,首先运行一些一次性数据生成,为后续过程准备数据以供使用。或者,根据您的操作系统和限制,您可以在相同或不同的主机上同时运行部分程序,并让它们使用IPC机制(如共享内存或网络)进行通信
当然,问题中可能无意中使用了“代码”,而真正的问题是堆耗尽,甚至是堆栈耗尽——也有不同的技术来解决它们,但不想因为猜测而偏离正轨
2) 你得到了一个项目,它的执行速度比预期的慢。你是怎么处理的
首先,您需要确定缓慢的原因和类型:
- 项目I/O受限、CPU受限、各步骤之间的硬编码延迟(这种情况会发生,尤其是在屏幕抓取应用程序中,在屏幕抓取应用程序中,事先没有制定出更具可扩展性和鲁棒性的方法),是否会出现调度延迟等问题
- 那么-它是什么类型的慢度-延迟还是吞吐量