有效地存储数据以节省ram使用,而无需在C#中查找开销
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了有效地存储数据以节省ram使用,而无需在C#中查找开销,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2012字,纯文字阅读大概需要3分钟。
内容图文
![有效地存储数据以节省ram使用,而无需在C#中查找开销](/upload/InfoBanner/zyjiaocheng/812/6aac61e921034376b1083cbf93f56eb0.jpg)
根据我的经纪人的位置及其旋转,我需要确定到墙的距离.由于这个函数需要一点点并且需要调用很多,我的想法是通过离散位置x和y以及角度来存储距离.
因此,我的函数调用如下:
float GetWallDistance(int x, int y, int angle)
{
return CalcWallDistance(x, y, angle);
}
其中x和y的范围是0到500,角度范围是0到360.我的第一个想法是将它存储在多维数组中,如下所示:
使用float [,,] saveArray = new float [500,500,360]在某处初始化数组;
float GetWallDistance(int x, int y, int angle)
{
float distance = 0;
if(saveArray[x, y, angle] == 0)
{
distance = CalcWallDistance(x, y, angle);
saveArray[x, y, angle] = distance;
}
else
{
distance = saveArray[x, y, angle];
}
return distance;
}
这极大地加快了计算时间,但问题在于saveArray占用了相当大的内存,并且代理很可能不会通过整个500 x 500 x 360搜索空间.因此,很多内存都是无用的.
因此,我使用字典来更有效地存储数据,如下所示:
使用Dictionary< double,float>在某处初始化字典saveDictionairy = new Dictionary< double,float>();
float GetWallDistance(int x, int y, int angle)
{
double key = (double)x * 1000 + (double)y + (double)angle/1000
float distance = 0;
if(!saveDictionairy.TryGetValue(key, out distance))
{
distance = CalcWallDistance(x, y, angle);
saveDictionairy.Add(key, distance);
}
return distance;
}
(我尝试使用字符串作为字典的键,但似乎连接x,y和角度显然需要相当长的时间)
该方法确实具有更高的存储器效率,但是对于索引多维数组,使用键项的字典的查找时间增加了很多.
有没有人知道如何以一种易于查找的方式有效地存储这些数据?
解决方法:
.NET Dictionary使用快速算法,但仍然具有相当高的开销.我试着让它在不久前变得更快.我发现通过删除我不需要的东西以及进行其他设计更改,我可以将速度提高6倍.
例如,Dictionary使用模运算符将哈希码映射到存储桶. %出乎意料地缓慢.我认为需要31个CPU周期.当我用hashCode&替换它时bucketCountMask,其中bucket计数是2的幂,bucketCountMask是buckets.Length – 1我立刻意识到了很大的性能提升.
我还删除了对删除项目和迭代器版本功能的支持.我直接暴露了slot数组,以便调用者可以直接改变其中的数据.
这种自定义类型更快,因为它更专业于我的需求,它的API使用起来要困难得多.
GitHub上的.NET代码包含一个DictionarySlim类型供内部使用.也许你可以使用它.
内容总结
以上是互联网集市为您收集整理的有效地存储数据以节省ram使用,而无需在C#中查找开销全部内容,希望文章能够帮你解决有效地存储数据以节省ram使用,而无需在C#中查找开销所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。