首页 / C# / C#性能 – 线性阵列访问与随机访问
C#性能 – 线性阵列访问与随机访问
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了C#性能 – 线性阵列访问与随机访问,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2255字,纯文字阅读大概需要4分钟。
内容图文
![C#性能 – 线性阵列访问与随机访问](/upload/InfoBanner/zyjiaocheng/790/fcafe351d272478ea23d955b3c931a2c.jpg)
有人可以帮助我理解为什么使用索引的线性增量访问数组大约比使用随机索引快3-4倍?
有没有办法让随机索引访问时间更快?
请考虑以下测试代码,线性返回约3秒,随机返回约9-10秒:
public static void test()
{
var arr = new byte[64 * 1024 * 1024];
byte b = 0;
var sw = new Stopwatch();
double timeSum = 0;
for (var i = 0; i < arr.Length; i++)
{
sw.Restart();
b = arr[i];
sw.Stop();
timeSum += sw.Elapsed.TotalMilliseconds;
}
Console.WriteLine("Linear access : " + timeSum + " ms");
timeSum = 0;
var rng = new Random();
var rnum = 0;
for (var i = 0; i < arr.Length; i++)
{
rnum = rng.Next(0, arr.Length - 1);
sw.Restart();
b = arr[rnum];
sw.Stop();
timeSum += sw.Elapsed.TotalMilliseconds;
}
sw.Stop();
Console.WriteLine("Random access : " + timeSum + " ms");
}
解决方法:
您在基准测试中看到的差异(4到5次)不能仅通过缓存行和对数组的顺序访问来解释.确实顺序可预测的访问速度会更快,但除非您管理大型数组,否则如果性能提升甚至接近这些数字,我会感到惊讶.
编辑基于您的基准测试中的阵列大小(64x 1024×1024),实际上差异是惊人的,比我预期的要多.所以我的第一印象是错误的!
问题是你的基准.你是微观测量;您无法使用System.Diagnostics.Stopwatch以任何形式自信地测量个人查找.
试图提出一个公平的基准是令人惊讶的棘手,因为没有简单的方法来隔离随机生成与查找.我没有多想,但以下至少尝试比较苹果和苹果:诀窍是预生成随机和顺序数组,然后基准双重查找:
static void Main(string[] args)
{
lookUpArray(1, new[] { 0 }, new[] {0}); //warmup JITTER
var r = new Random();
const int arraySize = 10000;
const int repetitions = 10000;
var lookupArray = new int[arraySize]; //values dont matter
var sequentialArray = Enumerable.Range(0, arraySize).ToArray();
var randomArray = sequentialArray.Select(i => r.Next(0, arraySize)).ToArray();
for (var i = 0; i < 10; i++)
{
var sw = Stopwatch.StartNew();
lookUpArray(repetitions, lookupArray, randomArray);
sw.Stop();
Console.WriteLine($"Random: {sw.ElapsedMilliseconds} ms");
sw.Reset();
sw.Start();
lookUpArray(repetitions, lookupArray, sequentialArray);
sw.Stop();
Console.WriteLine($"Sequential: {sw.ElapsedMilliseconds} ms");
}
}
private static void lookUpArray(int repetitions, int[] lookupArray, int[] indexArray)
{
for (var r = 0; r < repetitions; r++)
{
for (var i = 0; i < indexArray.Length; i++)
{
var _ = lookupArray[indexArray[i]];
}
}
}
我无论如何都不是基准测试专家,所以这在很多方面可能都很糟糕,但我认为这是一个更公平的比较.
内容总结
以上是互联网集市为您收集整理的C#性能 – 线性阵列访问与随机访问全部内容,希望文章能够帮你解决C#性能 – 线性阵列访问与随机访问所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。