안전하지 않은/안전하지 않은/dll 호출 속도 비교가있는 실험으로 1 meg 길이의 char 배열의 모든 위치에서 200 바이트 배열의 문자 일치 계산에 안전하지 않은 포인터를 사용하여 테스트하고 있습니다. .포인터가있는 안전하지 않은 블록이 일반 버전보다 느린 이유
코드는 최적화 모드로 실행되고, 안전하지 않고 범위 검사는 허용되지 않습니다. 긴 문자 배열은 호출 오버 헤드 영향을 최소화하기 위해 의도적으로 사용됩니다. 제가
얻을시간은 830 밀리
DLL 205 MS
이유 불안전 느린
안전
일반 560 밀리 초이다 ??
byte[] buffer = new Byte[1000000]; byte[] check = new Byte[1000]; [DllImport("sortitdev.dll", CallingConvention=CallingConvention.StdCall)] //[DllImport("sortitfast.dll", CallingConvention=CallingConvention.StdCall)] //[DllImport("sortitpellas.dll", CallingConvention=CallingConvention.StdCall)] public unsafe static extern void sortitt([MarshalAs(UnmanagedType.LPArray)] byte[] buffer); public MainForm() { InitializeComponent(); } void Button1Click(object sender, EventArgs e) // do char array matching { byte match; Random rnd = new Random(); for(int i=0;i<1000000;i++) buffer[i]=(byte)rnd.Next(0,256); for(int i=0;i<200;i++) check[i]=(byte)rnd.Next(0,256); Stopwatch sw = Stopwatch.StartNew(); int kk=0; int jq=0; while(kk<999000) { kk++; match=0; for(jq=0;jq<199;jq++) if(buffer[kk+jq]==check[jq])match++; buffer[kk]=match; } sw.Stop(); textBox1.Text= sw.Elapsed.TotalMilliseconds.ToString(); sw.Reset(); sw.Start(); unsafe { fixed (byte* bufptr=&buffer[0] , chckptr=&check[0]) { byte* bufptrC=bufptr; // modifiable pointer byte* chckptrC=chckptr; byte* bufhldptr; byte* chckhldptr; int k=999000; int jw=0; while(k>0) { bufhldptr=bufptrC; match=0; chckhldptr=chckptrC; for(jw=0;jw<199;jw++) if(*bufhldptr++==*chckhldptr++)match++; *bufptrC++=match; k--; } } sw.Stop(); textBox2.Text= sw.Elapsed.TotalMilliseconds.ToString(); } sw.Reset(); for(int tt=0;tt<200;tt++) buffer[tt]=(byte)tt; sw.Start(); unsafe { fixed(byte* dadata=&buffer[0]) { sortitt(buffer); } } sw.Stop(); textBox3.Text= sw.Elapsed.TotalMilliseconds.ToString(); int kll=(int)buffer[1]; textBox4.Text= kll.ToString(); } }
나는 당신이 더 많은 공간을 사용해야한다고 생각합니다, 그것은 당신의 코드를 더 읽기 쉽게 만들 것입니다. 이것은 코드 골프가 아닙니다. – svick
디버거를 연결하지 않고 실행 했습니까? – svick
svick, 예 디버거없이 실행되었습니다. –