【发布时间】:2016-03-20 00:55:24
【问题描述】:
我有两个接口。 ICacheHolder 将由一个实现游戏对象逻辑的类和 IVisualizer 实现,该类将成为视觉表示。
public interface ICacheHolder
{
void updateCacheWithCurrentState(int chachFrame);
void resizeCache(int newSize);
T getCacheFrame<T>(int cacheIndex, float interpolationToNext) where T : struct;
}
public interface IVisualizer
{
void updateVisualization(ICacheHolder cacheHolder, int cacheIndex, float interpolation);
}
每个 ICacheHolder 都连接到一个 IVisualizer 对象,关系是 1 对 1。 我正在尝试确定将它们存储在两个单独的列表中还是作为结构存储在一个列表中是否更好(性能/内存方面)。会有很大的不同吗?如果我使用 struct 版本会发生拳击吗?我估计列表的大小将从 100 到 1000。
版本 1:
public class CacheFramework
{
private List<ICacheHolder> cacheHolders = new List<ICacheHolder>();
private List<IVisualizer> visualizers = new List<IVisualizer>();
...
}
版本 2:
struct SimulationObject
{
public ICacheHolder CacheHolder;
public IVisualizer Visualizer;
}
public class CacheFramework
{
private List<SimulationObject> cacheHolder = new List<SimulationObject>();
...
}
添加和删除之类的操作不会很频繁地进行。只有在游戏开始时,可能会有很多添加调用。
版本 1:
private bool AddSimulationObject(ICacheHolder cacheHolder, IVisualizer visualizer)
{
if (!cacheHolders.Contains(cacheHolder) && !visualizers.Contains(visualizer))
{
cacheHolders.Add(cacheHolder);
visualizers.Add(visualizer);
return true;
}
return false;
}
版本 2:
private bool AddSimulationObject(ICacheHolder cacheHolder, IVisualizer visualizer)
{
int index = simulationObjects.FindIndex(
delegate (SimulationObject simulationObject)
{
return simulationObject.CacheHolder == cacheHolder || simulationObject.Visualizer == visualizer;
}
);
if (index >= 0 )
{
SimulationObject newObject;
newObject.CacheHolder = cacheHolder;
newObject.Visualizer = visualizer;
return true;
}
return false;
}
列表将至少被访问 每一帧都通过它的索引。
附加信息:
每个使用 ICacheHolder 的类都将包含一个List<struct>,其中包含位置、旋转或健康等数据。每个列表元素都将是时间的快照。目标是来回穿越时间。
编辑 1:
修正了 AddSimulationObject 版本 2 中的错误。
正如所指出的 AddSimulationObject 版本 2 可能是:
private bool AddSimulationObject(ICacheHolder cacheHolder, IVisualizer visualizer)
{
SimulationObject newObject = new SimulationObject { CacheHolder = cacheHolder, Visualizer = visualizer };
if (simulationObjects.Contains(newObject))
{
simulationObjects.Add(newObject);
return true;
}
return false;
}
但在这种情况下,我需要确保 cacheHolder 和可视化工具不会出现在任何其他组合中。
编辑 2:
我正在使用主要支持 NET 的 Unity3D。 3.5
正如所指出的,使用查找速度比 List 更快的 .NET 集合可能会更好。或者,如果列表是可排序的,请使用 List.BinarySearch。
编辑 3:
我将使用结构版本。我不确定会有多少查找。如果它会成为问题,我可能会更改为另一个 .NET 集合。
【问题讨论】:
-
每当我看到性能问题时,我都会链接这个:ericlippert.com/2012/12/17/performance-rant
-
您将两个版本都显示为代码。那么您使用该代码测量的时间/内存值在哪里?如果您已对其进行测量,则可以根据您的标准判断出哪个版本符合您的要求。
-
仅供参考 - 您不需要您的
FindIndex与代表。与相同字段比较时,结构将返回true。即:new SimulationObject { CacheHolder = ch, Visualizer = v }.Equals(new SimulationObject { CacheHolder = ch, Visualizer = v })将返回 true。你可以简单地使用var exists = simulationObjects.Contains(new SimulationObject { CacheHolder = cacheHolder, Visualizer = visualizer }); -
任何性能问题都应首先通过 DotTrace 等性能分析工具进行测量。
-
@Rob 他不是在检查所有字段是否相等,而是在检查是否有任何字段相等,所以它不能被简单的包含替换
标签: c#