From 12237bba057c1c63ee9e75d19c1f4c678ecf13e2 Mon Sep 17 00:00:00 2001 From: Sun Serega Date: Thu, 27 Sep 2018 14:26:38 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A3=D0=B1=D1=80=D0=B0=D0=BB=20=D1=81=D0=BE?= =?UTF-8?q?=D0=B7=D0=B4=D0=B0=D0=BD=D0=B8=D0=B5=20=D1=83=D0=BA=D0=B0=D0=B7?= =?UTF-8?q?=D0=B0=D1=82=D0=B5=D0=BB=D0=B5=D0=B9=20=D0=BD=D0=B0=20=D0=BC?= =?UTF-8?q?=D0=B0=D1=81=D1=81=D0=B8=D0=B2=20=D0=B2=20=D0=BF=D1=80=D0=B8?= =?UTF-8?q?=D0=BC=D0=B5=D1=80=D0=B5=20-=20=D1=81=D1=80=D0=B0=D0=B2=D0=BD?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B8=20=D1=81=D0=BA=D0=BE=D1=80=D0=BE=D1=81?= =?UTF-8?q?=D1=82=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Сравнение скорости.pas | 92 ++++++++++++------- 1 file changed, 60 insertions(+), 32 deletions(-) diff --git a/InstallerSamples/BlockFileOfT/Сравнение скорости.pas b/InstallerSamples/BlockFileOfT/Сравнение скорости.pas index c50319729..622f6dfcf 100644 --- a/InstallerSamples/BlockFileOfT/Сравнение скорости.pas +++ b/InstallerSamples/BlockFileOfT/Сравнение скорости.pas @@ -5,7 +5,13 @@ type LayoutKind = System.Runtime.InteropServices.LayoutKind; FieldOffset = System.Runtime.InteropServices.FieldOffsetAttribute; + GCHandle = System.Runtime.InteropServices.GCHandle; + GCHandleType = System.Runtime.InteropServices.GCHandleType; + + + //Эти 2 типа взят из справки, и по рекомендациям от туда переделан под наш случай + //имеется в виду справка, которая html файл, лежащий в папке с этим примером [StructLayout(LayoutKind.&Explicit)] CharArr255Body = record private const MaxLength = 255; @@ -15,40 +21,56 @@ type end; [StructLayout(LayoutKind.&Explicit)] CharArr255 = record - public [FieldOffset(0)] length: byte; - public [FieldOffset(1)] body: CharArr255Body; + public [FieldOffset(0)] length: byte; + public [FieldOffset(1)] body: CharArr255Body; public class function operator explicit(a: array of char): CharArr255; begin - if a.Length > CharArr255Body.MaxLength then - begin - var na := new char[CharArr255Body.MaxLength]; - System.Array.Copy(a, na, CharArr255Body.MaxLength); - a := na; - end; - Result.length := a.Length; - if a.Length < CharArr255Body.MaxLength then - begin - var na := new char[CharArr255Body.MaxLength]; - System.Array.Copy(a, na, a.Length); - a := na; - end; + Result.length := Min(CharArr255Body.MaxLength, a.Length);//если a.Length>MaxLength - length присвоит MaxLength - var ptr: ^CharArr255Body := pointer(@a[0]); - Result.body := ptr^; + if a.Length < CharArr255Body.MaxLength then + a := a + new char[CharArr255Body.MaxLength - a.Length];//если a.Length, потому что он сохраняет их всех сразу. + var lc := 10; + var ec := 10000;//Чем больше элементов - тем больше преимущество BlockFileOf, потому что он сохраняет их всех сразу. //Но он быстрее даже если сохранять по 1 элементу var t1, t2: int64; @@ -235,12 +263,12 @@ begin loop lc do begin Rewrite(f1); - foreach var a in test_arr.Select(a -> AR(a)) do - f1.Write(a); + var AR_arr := test_arr.ConvertAll(a -> AR(a)); + foreach var a in AR_arr do f1.Write(a); f1.Close; Reset(f1); - foreach var el in SeqGen(ec, i -> f1.Read).Select(a -> IOR(a)) do; + ArrGen(ec, i -> IOR(f1.Read)); f1.Close; end; sw.Stop;