내 과제는 재작성할 프로그램이 본래의 역할을 있도록 닫으십시오 수 있다.
이 프로그램을 작성하는 과정에서 a bunch of 파일 처리 이전 개발자 누가 작성했습니까 구조 파일 형식으로 해당하는 많은 필드를 포함하는 설정할 수 있다, 그래서 내가 쓴 모든 작업은 이미 끝났다.
이 필드는 모두 바이트입니다 배열입니다. C++ 코드를 사용하여 그 어떤 '은' 모든 공백 문자 ('0x20') 이 전체 구조를 멤세트 설정할 수 있습니다. 한 줄로 코드입니다. 간편해집니다.
이 유틸리티를 매우 중요하다는 결국 이 형식으로 파일을 해당 파일을 마이그레이션된 노리고 있다. # 39 로 변경, 해야 할 것은 어떤 I& 숨기지 않았다, 하지만 난 이 구조체입니다 클래스 C # 의 모든 방법을 쉽게 찾을 수 없는 이러한 각 바이트입니다 어레이에는 초기화하지 공백 문자.
//Initialize all of the variables to spaces.
int index = 0;
foreach (byte b in UserCode)
{
UserCode[index] = 0x20;
index++;
}
이 작품은 I& # 39 m, 좋아요, 하지만 이렇게 간단한 방법을 있어야 합니다. [6] 때 '로 설정되었습니다 어레이입니다 우저고데 = new 바이트입니다 구성자를 자동으로 초기화되었습니다 기본 값이 null 바이트 어레이입니다' 가 된다. 없는 방식으로 내말들어봐 내가 되면 모든 공백을 빛위에 선언 도왔으매 when I call my class& # 39. 구성자를 초기화되었습니다 것이 바로 이렇게? 일부 '또는' 과 유사한 기능을 멤세트?
소규모 어레이에는 어레이입니다 초기화 구문 사용합니다.
var sevenItems = new byte[] { 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20 };
대용량 스토리지 시스템을 위한 표준 '을 사용하여' 루프지 이것이 가장 효과적인 방법으로 읽을 수 있다.
var sevenThousandItems = new byte[7000];
for (int i = 0; i < sevenThousandItems.Length; i++)
{
sevenThousandItems[i] = 0x20;
}
물론 이렇게 할 경우 다음 도우미 코드를 간결하게 유지할 수 있는 방법을 많이 만들 수 있습니다.
byte[] sevenItems = CreateSpecialByteArray(7);
byte[] sevenThousandItems = CreateSpecialByteArray(7000);
// ...
public static byte[] CreateSpecialByteArray(int length)
{
var arr = new byte[length];
for (int i = 0; i < arr.Length; i++)
{
arr[i] = 0x20;
}
return arr;
}
너메라블레그리피스 () 사용할 수 있습니다.
100 을 어레이입니다 항목에서와 초기화되었습니다 0x20:
byte[] arr1 = Enumerable.Repeat(0x20,100).ToArray();
초기화 하는 경우 작은 어레이입니다 사용할 수 있습니다.
byte[] smallArray = new byte[] { 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20 };
더 큰 어레이입니다 관심용 경우 사용할 수 있습니다.
byte[] bitBiggerArray Enumerable.Repeat(0x20, 7000).ToArray();
이는 향후 담당이잖아요 / 거미요 쉽고 간편하게 읽을 수 있습니다. 충분히 빨리 예정이며 99.9% 의 시간. (일반적으로 BestOption™ 될 것으로 보인다.)
하지만 정말 정말 필요한 경우, 이 방법을 사용하여, P / invoke, 초고속 호출하십시오 아웃하려면 멤세트 최적화되었는지 사용할 수 있습니다. (여기서 랩된 up in a nice 사용할 수 있는 클래스)
public static class Superfast
{
[DllImport("msvcrt.dll",
EntryPoint = "memset",
CallingConvention = CallingConvention.Cdecl,
SetLastError = false)]
private static extern IntPtr MemSet(IntPtr dest, int c, int count);
//If you need super speed, calling out to M$ memset optimized method using P/invoke
public static byte[] InitByteArray(byte fillWith, int size)
{
byte[] arrayBytes = new byte[size];
GCHandle gch = GCHandle.Alloc(arrayBytes, GCHandleType.Pinned);
MemSet(gch.AddrOfPinnedObject(), fillWith, arrayBytes.Length);
return arrayBytes;
}
}
사용법:
byte[] oneofManyBigArrays = Superfast.InitByteArray(0x20,700000);
내 이전에 보세요들 제공했음 대답을 있습니다. 난 그냥 너회의 남용을 포리치 루프지 지적합니다. 이후, loop" 위한 표준 " 증분우선순위수준우선 인덱스화할 지켜보리니 합니다. 뿐만 아니라 약간만이라도 더 작고, 더 효율적인 (" foreach"; 많은 것들이 높여줍니까 후드 아래에):
for (int index = 0; index < UserCode.Length; ++index)
{
UserCode[index] = 0x20;
}
이 api 를 사용하는 것이 가장 빠른 방법으로.
bR = 0xFF.
틀필기념리 (왕부퍼, n필엘런, bR);
포인터입니다 사용하여, 길이 버퍼입니다 쓸 수 있으며, 인코딩되지 바이트입니다. 내가 생각하는 가장 빠른 길일 관리됨 작은 블록을 만들 수 있는 코드 (훨씬 속도가 느린 (,) 은 이를 바이트입니다 어레이입니다 초기화되었습니다 바이트입니다 부페리브록코프 사용할 수 있는 루프지 쓰기 내가 던진 haven& # 39 이 함께 하지만, t 테스트됨 아니지만, 요점:
long size = GetFileSize(FileName);
// zero byte
const int blocksize = 1024;
// 1's array
byte[] ntemp = new byte[blocksize];
byte[] nbyte = new byte[size];
// init 1's array
for (int i = 0; i < blocksize; i++)
ntemp[i] = 0xff;
// get dimensions
int blocks = (int)(size / blocksize);
int remainder = (int)(size - (blocks * blocksize));
int count = 0;
// copy to the buffer
do
{
Buffer.BlockCopy(ntemp, 0, nbyte, blocksize * count, blocksize);
count++;
} while (count < blocks);
// copy remaining bytes
Buffer.BlockCopy(ntemp, 0, nbyte, blocksize * count, remainder);
이는 빠른 버전의 코드 (post 로 표시된 해답이야
보유하고 있는 모든 벤치마크 보여주는 수행됨 간단한 for 루프 (해당 map_layer 칠 경우 이 같은 일이 어레이에서는 데크레멘팅 대對 경우 일반적으로 두 배 빠른 증가.
또한 어레이입니다 길이 속성은 이미 통과된 만큼, t need to # 39 에서 검색할 수 있도록 매개변수입니다 doesn& 어레이입니다 이다. 미리 계산 및 배정됩니다 로컬 변수 있어야 합니다.
public static byte[] CreateSpecialByteArray(int length)
{
byte[] array = new byte[length];
int len = length - 1;
for (int i = len; i >= 0; i--)
{
array[i] = 0x20;
}
return array;
}
아마도 이 일은 여러 번 길을 위해 단지 내 확장하십시오 답변 깔끔한 다음과 같이 쓸 수 있다.
PopulateByteArray(UserCode, 0x20);
호출하는:
public static void PopulateByteArray(byte[] byteArray, byte value)
{
for (int i = 0; i < byteArray.Length; i++)
{
byteArray[i] = value;
}
}
이를 위한 효율적인 니스 (nice) 의 루프 (언급을 gwiazdorrr& # 39 의 오토메이티드) 뿐만 아니라 좋은 경우 깔끔한 보았으매 호출하십시오 많이유 사용되고 있다. 및 많이유 마로 at-a-glance 판독값 열거도 개인적으로 비해 한 것 같다. )
이 기능은 보다 for 루프는 어레이에서는 채우기 위한 방법입니다.
이 명령은 매우 빠른 메모리 복제본에 라이스코프 시작된다. 이 함수를 호출하는 명령 및 크기를 두 배로 활용할 수 있습니다) 에 의해 그 때까지 반복적으로 라이스코프 우리가 복제본에 어레이입니다 꽉 찼습니다.
내 블로그에 dell. < >, 내가 이 문제를 논의할, http://coding.grax.com/2013/06/fast-array-fill-function-revisited.html
참고로 이 약간만이라도 손쉬운 방법 등을 통해 추가 확장명으로 그냥 단어 " this"; 즉, 공용 정적 무효화 선언 '이 방법을 ArrayFill< T>. ([]' 이 T 라이트필.
public static void ArrayFill<T>(T[] arrayToFill, T fillValue)
{
// if called with a single value, wrap the value in an array and call the main function
ArrayFill(arrayToFill, new T[] { fillValue });
}
public static void ArrayFill<T>(T[] arrayToFill, T[] fillValue)
{
if (fillValue.Length >= arrayToFill.Length)
{
throw new ArgumentException("fillValue array length must be smaller than length of arrayToFill");
}
// set the initial array value
Array.Copy(fillValue, arrayToFill, fillValue.Length);
int arrayToFillHalfLength = arrayToFill.Length / 2;
for (int i = fillValue.Length; i < arrayToFill.Length; i *= 2)
{
int copyLength = i;
if (i > arrayToFillHalfLength)
{
copyLength = arrayToFill.Length - i;
}
Array.Copy(arrayToFill, 0, arrayToFill, i, copyLength);
}
}
속도를 높일 수 있는 코드를 사용하여 초기화 및 간편해집니다 병렬 클래스 (4) 과 .NET 새):
public static void PopulateByteArray(byte[] byteArray, byte value)
{
Parallel.For(0, byteArray.Length, i => byteArray[i] = value);
}
물론 어레이입니다 동시에 만들 수 있습니다.
public static byte[] CreateSpecialByteArray(int length, byte value)
{
var byteArray = new byte[length];
Parallel.For(0, length, i => byteArray[i] = value);
return byteArray;
}