ما هي الطريقة الأكثر فعالية لتنفيذ الحلقات عبر SortedList في VB عام 2008؟

StackOverflow https://stackoverflow.com/questions/1641389

  •  08-07-2019
  •  | 
  •  

سؤال

ورمز أدناه يوضح لي (على ما أظن) أن "لكل" حلقة أسرع حوالي 10٪ من حلقة "ط إلى n"، ولكن "لكل" حلقة يخلق 567k في الذاكرة الجديدة؟ هل هذا صحيح؟ الطريقة التي يتم عادة الأكثر كفاءة فيما يتعلق سرعة واستخدام الذاكرة؟

إذا كنت تريد تشغيل هذا الرمز في VB فقط إضافة زر و2 تسميات إلى نموذج.

Public Class StateObject
    Public WorkSocket As String = "FFFFFFFFFFFF"
    Public BufferSize As Integer = 32767
    Public Buffer(32767) As Byte
End Class

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    For cnt As Integer = 1 To 250
        Dim StateObjecter As New StateObject
        ClientNetList.Add(cnt.ToString, StateObjecter)
    Next
End Sub


Private ClientNetList As New SortedList(Of String, StateObject)
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim stop1 As New Stopwatch
    Dim stop2 As New Stopwatch

    Dim TotalMemory1 As Integer = GC.GetTotalMemory(False)
    stop1.Start()
    For cnt As Integer = 1 To 1000000
        For i = 0 To ClientNetList.Count - 1
            ClientNetList.Values(i).WorkSocket = "FFF"
        Next

    Next
    stop1.Stop()
    Dim TotalMemory2 As Integer = GC.GetTotalMemory(False)
    MsgBox(TotalMemory2 - TotalMemory1)

    TotalMemory1 = GC.GetTotalMemory(False)
    Dim fff As Integer = GC.GetGeneration(ClientNetList)
    stop2.Start()
    For cnt As Integer = 1 To 1000000
        For Each ValueType As StateObject In ClientNetList.Values
            ValueType.WorkSocket = "FFF"
        Next
    Next
    stop2.Stop()

    Dim ffff As Integer = GC.GetGeneration(ClientNetList)
    TotalMemory2 = GC.GetTotalMemory(False)
    MsgBox(TotalMemory2 - TotalMemory1)

    Label1.Text = "i: " & stop1.ElapsedMilliseconds
    Label2.Text = "e: " & stop2.ElapsedMilliseconds
End Sub
هل كانت مفيدة؟

المحلول

في نظام بلدي "لأنني = 1" كانت حلقة أسرع للاختبار الأول (النقرة الأولى من زر لتشغيل البرنامج) بنحو 20 في المئة. ولكن "لكل" حلقة كان الشعر أسرع في اختبارات لاحقة. و"لكل" حلقة أخذ المزيد من الذاكرة قليلا، ولكن هذا هو مؤقت وسيتم في نهاية المطاف القمامة التي تم جمعها.

وإيجابيات وسلبيات "لكل" و "لأنني =" تم مناقشتها هنا. لكل لطيف لأنه يعمل مع غيرها من الهياكل من المصفوفات، ويجعل كائن المتاحة. "لأني =" له ميزة تعيين حدود وترتيب العناصر الصفيف في الحلقة، ويتجنب الأخطاء التي يمكن أن تواجه مع المصفوفات:

Dim a(50) As Integer
Dim i As Integer
For Each i In a
  i = 22
  Next i

في هذا المثال، مجموعة يتم أبدا تهيئة إلى 22. المتغير i غير مجرد نسخة من عنصر صفيف، وعنصر مجموعة الأصلي لم يتم تغيير عند تعيين ط 22.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top