반응형
배열에 항목을 추가하는 가장 빠른 방법
기존 배열에 새 항목을 추가하는 가장 빠른 방법은 무엇입니까?
Dim arr As Integer() = {1, 2, 3}
Dim newItem As Integer = 4
(동적인 항목 목록으로 작업할 때는 차라리 다음을 사용해야 한다는 것을 이미 알고 있습니다.List
,ArrayList
또는 그와 유사한IEnumerables
하지만 어레이를 사용하는 기존 코드를 고수하는 경우에는 어떻게 해야 합니까?)
제가 지금까지 시도한 것:
' A) converting to List, add item and convert back
Dim list As List(Of Integer)(arr)
list.Add(newItem)
arr = list.ToArray()
' --> duration for adding 100.000 items: 33270 msec
' B) redim array and add item
ReDim Preserve arr(arr.Length)
arr(arr.Length - 1) = newItem
' --> duration for adding 100.000 items: 9237 msec
' C) using Array.Resize
Array.Resize(arr, arr.Length + 1)
arr(arr.Length - 1) = newItem
' --> duration for adding 100.000 items: 1 msec
' --> duration for adding 100.000.000 items: 1168 msec
항목이 추가될 때마다 전체 배열의 두 번 변환이 수행되므로 매우 느린 것 같습니다.더 빨라 보이지만 여전히 어레이는 한 번 복사됩니다.ReDim Preserve
C)가 이 시점에서 가장 빠른 것 같습니다.더 좋은 것은 없습니까?
사례 C)가 가장 빠릅니다.이것을 확장으로 사용:
Public Module MyExtensions
<Extension()> _
Public Sub Add(Of T)(ByRef arr As T(), item As T)
Array.Resize(arr, arr.Length + 1)
arr(arr.Length - 1) = item
End Sub
End Module
용도:
Dim arr As Integer() = {1, 2, 3}
Dim newItem As Integer = 4
arr.Add(newItem)
' --> duration for adding 100.000 items: 1 msec
' --> duration for adding 100.000.000 items: 1168 msec
Dim arr As Integer() = {1, 2, 3}
Dim newItem As Integer = 4
ReDim Preserve arr (3)
arr(3)=newItem
더 많은 정보를 위해 레딤.
다음에 무슨 일이 일어날지 몰랐던 사람들을 위해, 새로운 모듈 파일을 추가하고 아래에 @jor 코드(내가 해킹한 약간의 '아무것도' 배열을 지원하지 않음)를 넣으십시오.
Module ArrayExtension
<Extension()> _
Public Sub Add(Of T)(ByRef arr As T(), item As T)
If arr IsNot Nothing Then
Array.Resize(arr, arr.Length + 1)
arr(arr.Length - 1) = item
Else
ReDim arr(0)
arr(0) = item
End If
End Sub
End Module
그다지 깨끗하지는 않지만 효과가 있습니다 :)
Dim arr As Integer() = {1, 2, 3}
Dim newItem As Integer = 4
arr = arr.Concat({newItem}).ToArray
삽입하거나 읽는 빈도에 따라 다릅니다.필요한 경우 배열을 둘 이상 늘릴 수 있습니다.
numberOfItems = ??
' ...
If numberOfItems+1 >= arr.Length Then
Array.Resize(arr, arr.Length + 10)
End If
arr(numberOfItems) = newItem
numberOfItems += 1
또한 A의 경우 필요한 경우에만 어레이를 가져오면 됩니다.
Dim list As List(Of Integer)(arr) ' Do this only once, keep a reference to the list
' If you create a new List everything you add an item then this will never be fast
'...
list.Add(newItem)
arrayWasModified = True
' ...
Function GetArray()
If arrayWasModified Then
arr = list.ToArray()
End If
Return Arr
End Function
시간이 있으면 모두 List(목록)로 변환하여 배열을 제거하는 것이 좋습니다.
코드가 컴파일되지 않을 수 있음
언급URL : https://stackoverflow.com/questions/18097756/fastest-way-to-add-an-item-to-an-array
반응형
'programing' 카테고리의 다른 글
각도 2: 반응형 폼 컨트롤을 반복합니다. (0) | 2023.05.27 |
---|---|
비공유 멤버에 대한 참조를 사용하려면 공용 하위를 호출할 때 개체 참조가 발생해야 합니다. (0) | 2023.05.27 |
목표-C에서 NSString 토큰화 (0) | 2023.05.27 |
std::벡터 대 표준::C++의 배열 (0) | 2023.05.22 |
jQuery - 확인란 사용/사용 안 함 (0) | 2023.05.22 |