Tôi có hai giao diện. ICacheHolder sẽ được thực hiện bởi một lớp thực hiện logic của một đối tượng trò chơi và IVisualizer đó sẽ là đại diện trực quan.Hai Danh sách chứa một giao diện so với một Danh sách chứa một cấu trúc có hai giao diện
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);
}
Mỗi ICacheHolder kết nối với một đối tượng IVisualizer mối quan hệ là từ 1 đến 1. Tôi đang cố gắng để xác định xem tốt hơn của nó (hiệu suất/bộ nhớ khôn ngoan) để lưu trữ chúng trong hai danh sách riêng biệt hoặc trong một Danh sách như struct . Sẽ tạo ra một sự khác biệt lớn chút nào? Sẽ có boxing xảy ra nếu tôi sử dụng phiên bản struct? Tôi Recon kích thước của danh sách sẽ là từ 100 đến 1000.
Phiên bản 1:
public class CacheFramework
{
private List<ICacheHolder> cacheHolders = new List<ICacheHolder>();
private List<IVisualizer> visualizers = new List<IVisualizer>();
...
}
Version 2:
struct SimulationObject
{
public ICacheHolder CacheHolder;
public IVisualizer Visualizer;
}
public class CacheFramework
{
private List<SimulationObject> cacheHolder = new List<SimulationObject>();
...
}
hoạt động như Add và Remove sẽ không được thực hiện rất thường xuyên. Chỉ khi bắt đầu trò chơi, có thể có thêm nhiều cuộc gọi.
Phiên bản 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;
}
Version 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;
}
danh sách sẽ được truy cập ít nhất mỗi khung thông qua chỉ số của nó.
Thông tin bổ sung: Mỗi lớp sử dụng ICacheHolder sẽ chứa List<struct>
với dữ liệu như vị trí, xoay vòng hoặc sức khỏe. Mỗi phần tử danh sách sẽ là ảnh chụp nhanh kịp thời. Mục tiêu là nó di chuyển qua thời gian qua lại.
Sửa 1:
lỗi cố định trong AddSimulationObject Version 2.
Như đã chỉ ra AddSimulationObject Phiên bản 2 có thể là:
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;
}
Nhưng trong trường hợp này tôi sẽ cần phải chắc chắn cacheHolder và visualizer không xuất hiện trong bất kỳ kết hợp nào khác.
Chỉnh sửa 2:
Tôi đang sử dụng Unity3D mà hỗ trợ chủ yếu là NET. 3.5
Như đã chỉ ra, tốt hơn nên sử dụng bộ sưu tập .NET có tra cứu nhanh hơn Danh sách. Hoặc nếu danh sách có thể sắp xếp, hãy sử dụng List.BinarySearch.
Sửa 3:
Tôi sẽ sử dụng phiên bản struct. Tôi không phải là máy bay phản lực chắc chắn có bao nhiêu tra cứu sẽ có mặt ở đó. Tôi có thể đổi sang bộ sưu tập .NET khác nếu nó sắp xảy ra.
Bất cứ khi nào tôi thấy câu hỏi về hiệu suất, tôi liên kết câu hỏi này: http://ericlippert.com/2012/12/17/performance-rant/ – DavidG
Bạn đã hiển thị cả hai phiên bản dưới dạng mã. Vậy các giá trị thời gian/bộ nhớ bạn đã đo bằng mã đó là ở đâu? Nếu bạn đã đo nó, bạn có thể nói - tùy thuộc vào tiêu chí của bạn - phiên bản nào phù hợp với yêu cầu của bạn. –
Chỉ cần một FYI - bạn không cần 'FindIndex' của bạn với một đại biểu. Structs sẽ trả về 'true' khi so sánh với cùng các trường. Đó là: 'mới SimulationObject {CacheHolder = ch, Visualizer = v} .Equals (new SimulationObject {CacheHolder = ch, Visualizer = v})' sẽ trả về true. Bạn có thể chỉ đơn giản sử dụng 'var exist = simulationObjects.Contains (new SimulationObject {CacheHolder = cacheHolder, Visualizer = visualizer});' – Rob