小编Ben*_*gie的帖子

数组元数据问题(缓存行)

有一些简单的代码

Int32[] tmpInt = new Int32[32];

            long lStart = DateTime.Now.Ticks;


            Thread t1 = new Thread(new ThreadStart(delegate()
            {
                for (Int32 i = 0; i < 100000000; i++)
                    Interlocked.Increment(ref tmpInt[5]);
            }));

            Thread t2 = new Thread(new ThreadStart(delegate()
            {
                for (Int32 i = 0; i < 100000000; i++)
                    Interlocked.Increment(ref tmpInt[20]);
            }));


            t1.Start();
            t2.Start();

            t1.Join();
            t2.Join();

            Console.WriteLine(((DateTime.Now.Ticks - lStart)/10000).ToString());
Run Code Online (Sandbox Code Playgroud)

我的核心2组合需要大约3秒钟.如果我将t1中的索引更改为tmpInt [4],则需要约5.5秒.

无论如何,第一个缓存行在索引4处结束.由于缓存行是64字节而5个int32只是20个字节,这意味着在实际数组之前有44个字节的元数据和/或填充.

我测试的另一组值,其中5和21.5和21需要~3秒,但5和20需要~5.5秒,但这是因为索引20与索引5共享相同的缓存行,因为它们在相同的间隔内64个字节.

所以我的问题是,.Net在数组之前预留了多少数据并且这个数量在32位和64位系统之间变化了吗?

谢谢 :-)

.net c#

5
推荐指数
1
解决办法
763
查看次数

标签 统计

.net ×1

c# ×1