programing

배열에 항목을 추가하는 가장 빠른 방법

starjava 2023. 5. 27. 09:15
반응형

배열에 항목을 추가하는 가장 빠른 방법

기존 배열에 새 항목을 추가하는 가장 빠른 방법은 무엇입니까?

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 PreserveC)가 이 시점에서 가장 빠른 것 같습니다.더 좋은 것은 없습니까?

사례 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

반응형