FFI 缓存优化
在涉及原生函数调用(如C/C++扩展,包括MC-MODSDK)的性能敏感代码中,合理的缓存结果可以显著降低调用开销。
性能瓶颈案例
对于需要频繁FFI获取的大型数据结构(如配置、状态等),每次调用均需跨越语言边界,导致显著的性能开销。例如,以下代码每次调用都会通过FFI获取世界实体列表,开销较大:
python
# -*- coding: utf-8 -*-
import mod.server.extraServerApi as serverApi
# 以MODSDK为例,获取世界实体列表的FFI调用开销较大
def GET_WORLD_ENTITY_LIST():
# C++侧需要实时构造数据并转换为Python对象返回,对于容器较大时开销显著增加
return list(serverApi.GetEngineActor())
for _ in range(100000): # py2:xrange
entities = GET_WORLD_ENTITY_LIST()优化缓存结果
对于不频繁变化的数据,可以采用惰性加载和缓存的方式,只有在数据变更时才刷新缓存。避免频繁向FFI层请求数据:
python
# -*- coding: utf-8 -*-
from .QuModLibs.Server import *
_WORLD_ENTITY_CACHE = []
_NEED_REFRESH = False
@Listen("AddEntityServerEvent")
def AddEntityServerEvent(_=None):
# 更新信号,标记需要刷新缓存
global _NEED_REFRESH
_NEED_REFRESH = True
@Listen("EntityRemoveEvent")
def EntityRemoveEvent(_=None):
# 更新信号,标记需要刷新缓存
global _NEED_REFRESH
_NEED_REFRESH = True
def GET_WORLD_ENTITY_LIST():
global _NEED_REFRESH
global _WORLD_ENTITY_CACHE
if _NEED_REFRESH:
# 需要刷新缓存
_NEED_REFRESH = False
_WORLD_ENTITY_CACHE = list(serverApi.GetEngineActor())
return _WORLD_ENTITY_CACHE
for _ in range(100000): # py2:xrange
entities = GET_WORLD_ENTITY_LIST()通过上述缓存优化后,FFI调用开销显著降低,性能提升明显。
总结
在涉及FFI调用的性能敏感场景中,合理的缓存策略可以有效降低调用开销。通过惰性加载和缓存机制,避免不必要的FFI调用,提升整体性能。