我有一个函数的2个版本,它们在C ++库中可用,它们执行相同的任务。一个是同步函数,另一个是异步类型,它允许注册回调函数。
以下哪种策略更适合提供更好的内存和性能优化?
我知道选项1中的工作线程创建会导致更多开销。我想知道与线程同步对象引起的开销有关的问题,以及它如何与异步调用引起的开销进行比较。函数的异步版本是否在内部分离线程并使用同步对象,还是使用其他一些技术来直接与内核通信?
答案 0 :(得分:2)
“简介,不要推测。” (DJB)
这个问题的答案取决于太多的事情,而且没有一般的答案。开发人员的角色是能够做出这些决定。如果您不知道,请尝试选项和测量。在许多情况下,差异无关紧要,非绩效问题将占主导地位。
“过早优化是所有邪恶的根源,比如97%的时间”(DEK)
更新以回复问题编辑:
通常,C ++库不会使用魔术来避免同步原语。异步与同步接口很可能是你要做的事情的包装器。处理必须在上下文中进行,如果要将完成信号发送到另一个上下文,则需要同步原语来执行此操作。当然,可能还有其他一些考虑因素。如果您的C ++库正在与可以进行处理的某些硬件进行通信,那么情况可能会有所不同。但你没有告诉过我们这样的事情。
这个问题的答案取决于你没有给我们的背景,包括有关库接口和代码结构的信息。
答案 1 :(得分:0)
使用异步函数,因为可能会使用同步函数手动执行您想要执行的操作但不易出错。
异步:将创建一个线程,完成后工作 - >呼叫回拨
同步:创建要等待的事件,创建工作线程,等待事件,线程调用同步版本,传输结果,信号事件。
答案 2 :(得分:0)
您可能会认为每个线程都有自己的环境,因此当所有其他条件相同时,它们会使用比非线程解决方案更多的内存。
根据您的线程库,启动和停止线程也会产生很大的开销。
如果您需要进程间同步,那么调试线程代码也会有很多痛苦。
如果您习惯编写非线程代码(即您不会花费大量时间编写和调试它),那么这可能是最佳选择。