我正在尝试在一个简单的 .net 核心 Api 中应用 Flyweight 方法模式,以查看与不使用该模式相比节省了多少内存。
我有两种方法,第一个创建 5000 个对象而不使用该模式,另一个创建 5000 个对象使用该模式。在他们每个人创建对象之后,他们都会调用一个方法,该方法返回 App 使用的当前内存。
public class MemoryService : IMemoryService
{
private readonly TreeFactory _treeFactory;
public MemoryService()
{
_treeFactory = new TreeFactory();
}
//create without pattern
public long SetObjectsMemory()
{
List<Tree> trees = new List<Tree>();
for (int i = 0; i < 5000; i++)
{
var tree = new Tree()
{
Id = new Random().Next(1, 9999999),
Part = new PartTree()
{
Name = "Nameany",
Bark = "Barkany",
Color = "Colorany"
}
};
trees.Add(tree);
};
return Utilities.GetCurrentMemoryUsed();
}
//crete with flyweight pattern
public long SetObjectsMemoryFactory()
{
List<Tree> trees = new List<Tree>();
for (int i = 0; i < 5000; i++)
{
var tree = new Tree()
{
Id = new Random().Next(1, 9999999),
Part = _treeFactory.GetPartTree("Nameany", "Barkany", "Colorany")
};
trees.Add(tree);
}
return Utilities.GetCurrentMemoryUsed();
}
}
我像使用 Parts 列表的类一样使用该模式,如果存在则返回一个 part 对象。
public class TreeFactory
{
private static List<PartTree> _parts;
public TreeFactory() {
_parts = new List<PartTree>();
}
public PartTree GetPartTree(string name, string bark, string color)
{
if (_parts.Any(x => x.Name == name && x.Bark == bark && x.Color == color))
{
return _parts.Where(x => x.Name == name && x.Bark == bark && x.Color == color).FirstOrDefault();
}
else {
var newpart = new PartTree()
{
Name = name,
Bark = bark,
Color = color
};
_parts.Add(newpart);
return newpart;
}
}
}
获取 App 使用的当前内存的方法是使用 Process 的这种方式(在 Utilities 类中):
public static long GetCurrentMemoryUsed() {
Int64 memory;
using (Process proc = Process.GetCurrentProcess())
{
memory = proc.PrivateMemorySize64 / (1024 * 1024);
}
return memory;
}
在我的 Startup 中,我像 Singleton 一样注入 MemoryService。在控制器中,我使用 3 种方法来调用函数:
[HttpGet, Route(nameof(WeatherForecastController.GenerateMemory))]
public IActionResult GenerateMemory()
{
var total=_memoryService.SetObjectsMemory();
return Ok(total);
}
[HttpGet, Route(nameof(WeatherForecastController.GenerateLiftMemory))]
public IActionResult GenerateLiftMemory()
{
var total = _memoryService.SetObjectsMemoryFactory();
return Ok(total);
}
[HttpGet, Route(nameof(WeatherForecastController.GetMemory))]
public IActionResult GetMemory()
{
var total = Utilities.GetCurrentMemoryUsed();
return Ok(total);
}
问题是:当我在导航器中调用没有模式(/weatherforecast/GenerateMemory) 的控制器中的方法时,返回(current)+2mb,但是当我调用 具有模式(/weatherforecast/GenerateLiftMemory) 的方法时,返回(当前)+3mb。
为什么具有模式享元的方法比没有模式的方法返回更多使用的 MB(增长)?
带有测试代码的存储库。Gitlab存储库内存api