可变数组结构删除操作的测试

  一般来说可变数组结构,如c#中List等。在内存不够时会自动进行重新alloc一段更长的空间,然后把旧的数据copy到新的内存空间中。在删除时,为了将数据对齐,又会自动将数据进行前移操作。

  下面进行一个测试:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
List<int> xxx = new List<int> {};
// 填充数据
for (int i = 0; i < 99999; ++i)
    xxx.Add(i);
var stopwatch = new System.Diagnostics.Stopwatch();
stopwatch.Start();
for (int i = 0; i < 99910; ++i)
{
    {
        // 操作1,直接删除对应位置的数据
        xxx.RemoveAt(55);
    }
    {
        // 操作2,把最后个数据填充到需要删除的位置上来,始终删除最后一个数据
        int lastIndex = 99999 - i - 1;
        xxx[99910 - i + 54] = xxx[lastIndex];
        xxx.RemoveAt(lastIndex);
    }
}
stopwatch.Stop();
// 打印耗时及结果
Debug.Log("used TIme:" + stopwatch.Elapsed.TotalMilliseconds.ToString());
Debug.Log(string.Join(",", xxx));

  操作1的结果是:

  操作2的结果是:

  测试方法比较极端,可见内存操作仍然耗时不少。

  由此可得出一个优化方案: 在元素顺序不重要的情况下,删除某项的操作可改为"与最后个元素进行交换,再删除最后项"。

 

posted @   hghhe  阅读(32)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示