Процедура MemoryFill - C#

Узнай цену своей работы

Формулировка задачи:

Здравствуйте! Имеется процедура заливки участка памяти некоторым значением:
   public unsafe void MemoryFill(int* ptr, int value, int count)
   {
      for(int i = 0; i < count; ++i)
      {
         ptr[i] = value;
      }
   }
Возможно ли ускорить эту процедуру, применив к ней какие-нибудь оптимизации, но без использования нативных библиотек? Только средствами языка С#.

Решение задачи: «Процедура MemoryFill»

textual
Листинг программы
using System;
using System.Diagnostics;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
 
namespace Test
{
   class Program
   {
      static unsafe void Main(string[] args)
      {
         int pass = 200000000;
         int count = 100;
         int value = 123456789;
         IntPtr handle = Marshal.AllocHGlobal(count * sizeof(int));
         int* ptr = (int*)handle;
 
         Stopwatch sw1 = Stopwatch.StartNew();
         for(int i = 0; i < pass; ++i)
         {
            MemoryFill(ptr, value, count);
         }
         sw1.Stop();
 
         Stopwatch sw2 = Stopwatch.StartNew();
         for(int i = 0; i < pass; ++i)
         {
            MemoryFillFast(ptr, value, count);
         }
         sw2.Stop();
 
         Marshal.FreeHGlobal(handle);
         Console.WriteLine(sw1.Elapsed);
         Console.WriteLine(sw2.Elapsed);
         Console.ReadKey();
      }
 
      [MethodImpl(MethodImplOptions.NoInlining)]
      public static unsafe void MemoryFill(int* ptr, int value, int count)
      {
         for(int i = 0; i < count; ++i)
         {
            ptr[i] = value;
         }
      }
 
      [MethodImpl(MethodImplOptions.NoInlining)]
      public static unsafe void MemoryFillFast(int* ptr, int value, int count)
      {
         long longValue = (long)(uint)value << 32 | (uint)value;
         long length = count << 2;
         byte* dst = (byte*)ptr;
         if(((int)dst & 4) != 0)
         {
            *(int*)dst = value;
            dst += 4;
            length -= 4;
         }
         long total = length >> 5;
         while(total > 0)
         {
            ((long*)dst)[0] = longValue;
            ((long*)dst)[1] = longValue;
            ((long*)dst)[2] = longValue;
            ((long*)dst)[3] = longValue;
            dst += 32;
            --total;
         }
         if((length & 16) != 0)
         {
            ((long*)dst)[0] = longValue;
            ((long*)dst)[1] = longValue;
            dst += 16;
         }
         if((length & 8) != 0)
         {
            *(long*)dst = longValue;
            dst += 8;
         }
         if((length & 4) != 0)
         {
            *(int*)dst = value;
         }
      }
   }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 3.786 из 5
Похожие ответы