Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 令人惊讶的性能差异:List.Constains、SortedList.ContainsKey、DataRowCollection.Contains、DataTable.Select、DataTable.FindBy_.net_Sql Server_Performance_Collections_Datatable - Fatal编程技术网

.net 令人惊讶的性能差异:List.Constains、SortedList.ContainsKey、DataRowCollection.Contains、DataTable.Select、DataTable.FindBy

.net 令人惊讶的性能差异:List.Constains、SortedList.ContainsKey、DataRowCollection.Contains、DataTable.Select、DataTable.FindBy,.net,sql-server,performance,collections,datatable,.net,Sql Server,Performance,Collections,Datatable,最初,我想询问查询特殊行的数据表的最快方法 Dim applies As Boolean Dim clock As New System.Diagnostics.Stopwatch clock.Start() For i As Int32 = 1 To 1000000 applies = sortedListAC17NextClaims.ContainsKey(myClaim.idData) Next clock.Stop() Dim timeSpan1 As String = "Ti

最初,我想询问查询特殊行的数据表的最快方法

Dim applies As Boolean
Dim clock As New System.Diagnostics.Stopwatch

clock.Start()
For i As Int32 = 1 To 1000000
    applies = sortedListAC17NextClaims.ContainsKey(myClaim.idData)
Next
clock.Stop()
Dim timeSpan1 As String = "Timespan 1: " & clock.Elapsed.TotalMilliseconds.ToString & " ms"

clock.Reset()
clock.Start()
For i As Int32 = 1 To 1000000
    applies = listAC17NextClaims.Contains(myClaim.idData)
Next
clock.Stop()
Dim timeSpan2 As String = "Timespan 2: " & clock.Elapsed.TotalMilliseconds.ToString & " ms"

clock.Reset()
clock.Start()
For i As Int32 = 1 To 1000000
    applies = Not MyDS.AC17NextClaims.FindByIdData(myClaim.idData) Is Nothing
Next
clock.Stop()
Dim timeSpan3 As String = "Timespan 3: " & clock.Elapsed.TotalMilliseconds.ToString & " ms"

clock.Reset()
clock.Start()
For i As Int32 = 1 To 1000000
    applies = MyDS.AC17NextClaims.Select("idData=" & myClaim.idData).Length > 0
Next
clock.Stop()
Dim timeSpan4 As String = "Timespan 4: " & clock.Elapsed.TotalMilliseconds.ToString & " ms"

clock.Reset()
clock.Start()
For i As Int32 = 1 To 1000000
    applies = MyDS.AC17NextClaims.Rows.Contains(myClaim.idData)
Next
clock.Stop()
Dim timeSpan5 As String = "Timespan 5: " & clock.Elapsed.TotalMilliseconds.ToString & " ms"
我测试了5种不同方法的性能,结果令人惊讶

Dim applies As Boolean
Dim clock As New System.Diagnostics.Stopwatch

clock.Start()
For i As Int32 = 1 To 1000000
    applies = sortedListAC17NextClaims.ContainsKey(myClaim.idData)
Next
clock.Stop()
Dim timeSpan1 As String = "Timespan 1: " & clock.Elapsed.TotalMilliseconds.ToString & " ms"

clock.Reset()
clock.Start()
For i As Int32 = 1 To 1000000
    applies = listAC17NextClaims.Contains(myClaim.idData)
Next
clock.Stop()
Dim timeSpan2 As String = "Timespan 2: " & clock.Elapsed.TotalMilliseconds.ToString & " ms"

clock.Reset()
clock.Start()
For i As Int32 = 1 To 1000000
    applies = Not MyDS.AC17NextClaims.FindByIdData(myClaim.idData) Is Nothing
Next
clock.Stop()
Dim timeSpan3 As String = "Timespan 3: " & clock.Elapsed.TotalMilliseconds.ToString & " ms"

clock.Reset()
clock.Start()
For i As Int32 = 1 To 1000000
    applies = MyDS.AC17NextClaims.Select("idData=" & myClaim.idData).Length > 0
Next
clock.Stop()
Dim timeSpan4 As String = "Timespan 4: " & clock.Elapsed.TotalMilliseconds.ToString & " ms"

clock.Reset()
clock.Start()
For i As Int32 = 1 To 1000000
    applies = MyDS.AC17NextClaims.Rows.Contains(myClaim.idData)
Next
clock.Stop()
Dim timeSpan5 As String = "Timespan 5: " & clock.Elapsed.TotalMilliseconds.ToString & " ms"
背景: 我已在MS Sql Server 2005数据库中创建了一个视图。此视图当前共有6318行。因为我必须经常检查这个视图中是否存在给定的id,所以我想知道最有效的方法是什么。我在强类型数据集中创建了一个DataAdapter,它返回所有行并填充一个Datatable。 我的第一种方法是创建一个共享的通用列表(Int32),并在应用程序启动时用视图中的ID填充它。然后使用检查当前ID是否在此列表中。因为所有行都是不同的,我想知道使用SortedList及其-metod是否更快。 然后,我还使用its、自动生成的its(当列定义为主键时)以及最后但并非最不重要的-Method检查了直接访问数据表的性能。 因此,我有5种方法来检查我的ID是否在该视图(或映射列表/分类列表)中

Dim applies As Boolean
Dim clock As New System.Diagnostics.Stopwatch

clock.Start()
For i As Int32 = 1 To 1000000
    applies = sortedListAC17NextClaims.ContainsKey(myClaim.idData)
Next
clock.Stop()
Dim timeSpan1 As String = "Timespan 1: " & clock.Elapsed.TotalMilliseconds.ToString & " ms"

clock.Reset()
clock.Start()
For i As Int32 = 1 To 1000000
    applies = listAC17NextClaims.Contains(myClaim.idData)
Next
clock.Stop()
Dim timeSpan2 As String = "Timespan 2: " & clock.Elapsed.TotalMilliseconds.ToString & " ms"

clock.Reset()
clock.Start()
For i As Int32 = 1 To 1000000
    applies = Not MyDS.AC17NextClaims.FindByIdData(myClaim.idData) Is Nothing
Next
clock.Stop()
Dim timeSpan3 As String = "Timespan 3: " & clock.Elapsed.TotalMilliseconds.ToString & " ms"

clock.Reset()
clock.Start()
For i As Int32 = 1 To 1000000
    applies = MyDS.AC17NextClaims.Select("idData=" & myClaim.idData).Length > 0
Next
clock.Stop()
Dim timeSpan4 As String = "Timespan 4: " & clock.Elapsed.TotalMilliseconds.ToString & " ms"

clock.Reset()
clock.Start()
For i As Int32 = 1 To 1000000
    applies = MyDS.AC17NextClaims.Rows.Contains(myClaim.idData)
Next
clock.Stop()
Dim timeSpan5 As String = "Timespan 5: " & clock.Elapsed.TotalMilliseconds.ToString & " ms"
我用测试工具测试了他们的表现,得到了一些有趣的结果。我认为SortedList.ContainsKey一定比List.Contains快,因为它们是不同的,并且经过排序的,但事实恰恰相反。 但最让我惊讶的是DataRowCollection.Contains方法(我第一次忘记了)是迄今为止最快的。它甚至比dataTable.FindBy-method快50倍

Dim applies As Boolean
Dim clock As New System.Diagnostics.Stopwatch

clock.Start()
For i As Int32 = 1 To 1000000
    applies = sortedListAC17NextClaims.ContainsKey(myClaim.idData)
Next
clock.Stop()
Dim timeSpan1 As String = "Timespan 1: " & clock.Elapsed.TotalMilliseconds.ToString & " ms"

clock.Reset()
clock.Start()
For i As Int32 = 1 To 1000000
    applies = listAC17NextClaims.Contains(myClaim.idData)
Next
clock.Stop()
Dim timeSpan2 As String = "Timespan 2: " & clock.Elapsed.TotalMilliseconds.ToString & " ms"

clock.Reset()
clock.Start()
For i As Int32 = 1 To 1000000
    applies = Not MyDS.AC17NextClaims.FindByIdData(myClaim.idData) Is Nothing
Next
clock.Stop()
Dim timeSpan3 As String = "Timespan 3: " & clock.Elapsed.TotalMilliseconds.ToString & " ms"

clock.Reset()
clock.Start()
For i As Int32 = 1 To 1000000
    applies = MyDS.AC17NextClaims.Select("idData=" & myClaim.idData).Length > 0
Next
clock.Stop()
Dim timeSpan4 As String = "Timespan 4: " & clock.Elapsed.TotalMilliseconds.ToString & " ms"

clock.Reset()
clock.Start()
For i As Int32 = 1 To 1000000
    applies = MyDS.AC17NextClaims.Rows.Contains(myClaim.idData)
Next
clock.Stop()
Dim timeSpan5 As String = "Timespan 5: " & clock.Elapsed.TotalMilliseconds.ToString & " ms"
  • 是什么导致了这些差异
  • 我忘了更好的方法了吗
  • 我的测量方法正确吗(我认为我最好循环它们并取那个值)
  • 值是可传递的还是取决于数据表/集合的大小
  • 在我的更新(1000000次迭代)之后,ContainsKey是最快的。这是因为我总是检查相同的id还是一般的id?有没有一种没有字典键值对开销的分类列表
  • 结果[对于1000000次迭代*]

    Dim applies As Boolean
    Dim clock As New System.Diagnostics.Stopwatch
    
    clock.Start()
    For i As Int32 = 1 To 1000000
        applies = sortedListAC17NextClaims.ContainsKey(myClaim.idData)
    Next
    clock.Stop()
    Dim timeSpan1 As String = "Timespan 1: " & clock.Elapsed.TotalMilliseconds.ToString & " ms"
    
    clock.Reset()
    clock.Start()
    For i As Int32 = 1 To 1000000
        applies = listAC17NextClaims.Contains(myClaim.idData)
    Next
    clock.Stop()
    Dim timeSpan2 As String = "Timespan 2: " & clock.Elapsed.TotalMilliseconds.ToString & " ms"
    
    clock.Reset()
    clock.Start()
    For i As Int32 = 1 To 1000000
        applies = Not MyDS.AC17NextClaims.FindByIdData(myClaim.idData) Is Nothing
    Next
    clock.Stop()
    Dim timeSpan3 As String = "Timespan 3: " & clock.Elapsed.TotalMilliseconds.ToString & " ms"
    
    clock.Reset()
    clock.Start()
    For i As Int32 = 1 To 1000000
        applies = MyDS.AC17NextClaims.Select("idData=" & myClaim.idData).Length > 0
    Next
    clock.Stop()
    Dim timeSpan4 As String = "Timespan 4: " & clock.Elapsed.TotalMilliseconds.ToString & " ms"
    
    clock.Reset()
    clock.Start()
    For i As Int32 = 1 To 1000000
        applies = MyDS.AC17NextClaims.Rows.Contains(myClaim.idData)
    Next
    clock.Stop()
    Dim timeSpan5 As String = "Timespan 5: " & clock.Elapsed.TotalMilliseconds.ToString & " ms"
    
    • 时间跨度1==Ø0.65634[238.1095]ms
    • 时间跨度2==Ø0.06802[57045.37955]ms
    • 时间跨度3=(自动生成方法)=Ø0.31580[1542.62345]ms
    • 时间跨度4==Ø0.27790[26029.39635]ms
    • 时间跨度5==Ø0.00638[1202.79735]ms

      1.)
      Timespan 1: 0,6913 ms
      Timespan 2: 0,1053 ms
      Timespan 3: 0,3279 ms
      Timespan 4: 0,1002 ms
      Timespan 5: 0,0056 ms
      
      2.)
      Timespan 1: 0,6405 ms
      Timespan 2: 0,0588 ms
      Timespan 3: 0,3112 ms
      Timespan 4: 0,3872 ms
      Timespan 5: 0,0067 ms
      
      3.)
      Timespan 1: 0,6502 ms
      Timespan 2: 0,0588 ms
      Timespan 3: 0,3092 ms
      Timespan 4: 0,1268 ms
      Timespan 5: 0,007 ms
      
      4.)
      Timespan 1: 0,6504 ms
      Timespan 2: 0,0586 ms
      Timespan 3: 0,3092 ms
      Timespan 4: 0,3893 ms
      Timespan 5: 0,0063 ms
      
      5.)
      Timespan 1: 0,6493 ms
      Timespan 2: 0,0586 ms
      Timespan 3: 0,3215 ms
      Timespan 4: 0,386 ms
      Timespan 5: 0,0063 ms
      
      
      
      Timespan 1: 0,6913 0,6405 0,6502 0,6504 0,6493 = Ø 0,65634
      Timespan 2: 0,1053 0,0588 0,0588 0,0586 0,0586 = Ø 0,06802
      Timespan 3: 0,3279 0,3112 0,3092 0,3092 0,3215 = Ø 0,31580
      Timespan 4: 0,1002 0,3872 0,1268 0,3893 0,3860 = Ø 0,27790
      Timespan 5: 0,0056 0,0067 0,0070 0,0063 0,0063 = Ø 0,00638
      
      Dim applies As Boolean
      Dim clock As New System.Diagnostics.Stopwatch
      
      clock.Start()
      For i As Int32 = 1 To 1000000
          applies = sortedListAC17NextClaims.ContainsKey(myClaim.idData)
      Next
      clock.Stop()
      Dim timeSpan1 As String = "Timespan 1: " & clock.Elapsed.TotalMilliseconds.ToString & " ms"
      
      clock.Reset()
      clock.Start()
      For i As Int32 = 1 To 1000000
          applies = listAC17NextClaims.Contains(myClaim.idData)
      Next
      clock.Stop()
      Dim timeSpan2 As String = "Timespan 2: " & clock.Elapsed.TotalMilliseconds.ToString & " ms"
      
      clock.Reset()
      clock.Start()
      For i As Int32 = 1 To 1000000
          applies = Not MyDS.AC17NextClaims.FindByIdData(myClaim.idData) Is Nothing
      Next
      clock.Stop()
      Dim timeSpan3 As String = "Timespan 3: " & clock.Elapsed.TotalMilliseconds.ToString & " ms"
      
      clock.Reset()
      clock.Start()
      For i As Int32 = 1 To 1000000
          applies = MyDS.AC17NextClaims.Select("idData=" & myClaim.idData).Length > 0
      Next
      clock.Stop()
      Dim timeSpan4 As String = "Timespan 4: " & clock.Elapsed.TotalMilliseconds.ToString & " ms"
      
      clock.Reset()
      clock.Start()
      For i As Int32 = 1 To 1000000
          applies = MyDS.AC17NextClaims.Rows.Contains(myClaim.idData)
      Next
      clock.Stop()
      Dim timeSpan5 As String = "Timespan 5: " & clock.Elapsed.TotalMilliseconds.ToString & " ms"
      
    为了完整起见,VB.Net源代码的一部分

    Dim applies As Boolean
    Dim clock As New System.Diagnostics.Stopwatch
    
    clock.Start()
    For i As Int32 = 1 To 1000000
        applies = sortedListAC17NextClaims.ContainsKey(myClaim.idData)
    Next
    clock.Stop()
    Dim timeSpan1 As String = "Timespan 1: " & clock.Elapsed.TotalMilliseconds.ToString & " ms"
    
    clock.Reset()
    clock.Start()
    For i As Int32 = 1 To 1000000
        applies = listAC17NextClaims.Contains(myClaim.idData)
    Next
    clock.Stop()
    Dim timeSpan2 As String = "Timespan 2: " & clock.Elapsed.TotalMilliseconds.ToString & " ms"
    
    clock.Reset()
    clock.Start()
    For i As Int32 = 1 To 1000000
        applies = Not MyDS.AC17NextClaims.FindByIdData(myClaim.idData) Is Nothing
    Next
    clock.Stop()
    Dim timeSpan3 As String = "Timespan 3: " & clock.Elapsed.TotalMilliseconds.ToString & " ms"
    
    clock.Reset()
    clock.Start()
    For i As Int32 = 1 To 1000000
        applies = MyDS.AC17NextClaims.Select("idData=" & myClaim.idData).Length > 0
    Next
    clock.Stop()
    Dim timeSpan4 As String = "Timespan 4: " & clock.Elapsed.TotalMilliseconds.ToString & " ms"
    
    clock.Reset()
    clock.Start()
    For i As Int32 = 1 To 1000000
        applies = MyDS.AC17NextClaims.Rows.Contains(myClaim.idData)
    Next
    clock.Stop()
    Dim timeSpan5 As String = "Timespan 5: " & clock.Elapsed.TotalMilliseconds.ToString & " ms"
    
    • 更新: 我已经更改了我的结果和上面的来源。方括号中是1000000次迭代的值。现在结果完全不同了。现在最快的方法无疑是分类列表的ContainsKey

    • Dim applies As Boolean
      Dim clock As New System.Diagnostics.Stopwatch
      
      clock.Start()
      For i As Int32 = 1 To 1000000
          applies = sortedListAC17NextClaims.ContainsKey(myClaim.idData)
      Next
      clock.Stop()
      Dim timeSpan1 As String = "Timespan 1: " & clock.Elapsed.TotalMilliseconds.ToString & " ms"
      
      clock.Reset()
      clock.Start()
      For i As Int32 = 1 To 1000000
          applies = listAC17NextClaims.Contains(myClaim.idData)
      Next
      clock.Stop()
      Dim timeSpan2 As String = "Timespan 2: " & clock.Elapsed.TotalMilliseconds.ToString & " ms"
      
      clock.Reset()
      clock.Start()
      For i As Int32 = 1 To 1000000
          applies = Not MyDS.AC17NextClaims.FindByIdData(myClaim.idData) Is Nothing
      Next
      clock.Stop()
      Dim timeSpan3 As String = "Timespan 3: " & clock.Elapsed.TotalMilliseconds.ToString & " ms"
      
      clock.Reset()
      clock.Start()
      For i As Int32 = 1 To 1000000
          applies = MyDS.AC17NextClaims.Select("idData=" & myClaim.idData).Length > 0
      Next
      clock.Stop()
      Dim timeSpan4 As String = "Timespan 4: " & clock.Elapsed.TotalMilliseconds.ToString & " ms"
      
      clock.Reset()
      clock.Start()
      For i As Int32 = 1 To 1000000
          applies = MyDS.AC17NextClaims.Rows.Contains(myClaim.idData)
      Next
      clock.Stop()
      Dim timeSpan5 As String = "Timespan 5: " & clock.Elapsed.TotalMilliseconds.ToString & " ms"
      
    • 更新2: 我忘了另一种选择。 这对我来说似乎是最快的:

      Dim applies As Boolean
      Dim clock As New System.Diagnostics.Stopwatch
      
      clock.Start()
      For i As Int32 = 1 To 1000000
          applies = sortedListAC17NextClaims.ContainsKey(myClaim.idData)
      Next
      clock.Stop()
      Dim timeSpan1 As String = "Timespan 1: " & clock.Elapsed.TotalMilliseconds.ToString & " ms"
      
      clock.Reset()
      clock.Start()
      For i As Int32 = 1 To 1000000
          applies = listAC17NextClaims.Contains(myClaim.idData)
      Next
      clock.Stop()
      Dim timeSpan2 As String = "Timespan 2: " & clock.Elapsed.TotalMilliseconds.ToString & " ms"
      
      clock.Reset()
      clock.Start()
      For i As Int32 = 1 To 1000000
          applies = Not MyDS.AC17NextClaims.FindByIdData(myClaim.idData) Is Nothing
      Next
      clock.Stop()
      Dim timeSpan3 As String = "Timespan 3: " & clock.Elapsed.TotalMilliseconds.ToString & " ms"
      
      clock.Reset()
      clock.Start()
      For i As Int32 = 1 To 1000000
          applies = MyDS.AC17NextClaims.Select("idData=" & myClaim.idData).Length > 0
      Next
      clock.Stop()
      Dim timeSpan4 As String = "Timespan 4: " & clock.Elapsed.TotalMilliseconds.ToString & " ms"
      
      clock.Reset()
      clock.Start()
      For i As Int32 = 1 To 1000000
          applies = MyDS.AC17NextClaims.Rows.Contains(myClaim.idData)
      Next
      clock.Stop()
      Dim timeSpan5 As String = "Timespan 5: " & clock.Elapsed.TotalMilliseconds.ToString & " ms"
      
      clock.Start()
      For i As Int32 = 1 To 1000000
          applies = listAC17NextClaims.BinarySearch(myClaim.idData) > -1
      Next
      clock.Stop()
      
      执行1000000次迭代只需要219.1805毫秒,因此是最快的,没有SortedList键值对的开销。 我可以使用它而不必对列表进行排序,因为DataAdapter用ORDERBY子句填充了datatable

    • Dim applies As Boolean
      Dim clock As New System.Diagnostics.Stopwatch
      
      clock.Start()
      For i As Int32 = 1 To 1000000
          applies = sortedListAC17NextClaims.ContainsKey(myClaim.idData)
      Next
      clock.Stop()
      Dim timeSpan1 As String = "Timespan 1: " & clock.Elapsed.TotalMilliseconds.ToString & " ms"
      
      clock.Reset()
      clock.Start()
      For i As Int32 = 1 To 1000000
          applies = listAC17NextClaims.Contains(myClaim.idData)
      Next
      clock.Stop()
      Dim timeSpan2 As String = "Timespan 2: " & clock.Elapsed.TotalMilliseconds.ToString & " ms"
      
      clock.Reset()
      clock.Start()
      For i As Int32 = 1 To 1000000
          applies = Not MyDS.AC17NextClaims.FindByIdData(myClaim.idData) Is Nothing
      Next
      clock.Stop()
      Dim timeSpan3 As String = "Timespan 3: " & clock.Elapsed.TotalMilliseconds.ToString & " ms"
      
      clock.Reset()
      clock.Start()
      For i As Int32 = 1 To 1000000
          applies = MyDS.AC17NextClaims.Select("idData=" & myClaim.idData).Length > 0
      Next
      clock.Stop()
      Dim timeSpan4 As String = "Timespan 4: " & clock.Elapsed.TotalMilliseconds.ToString & " ms"
      
      clock.Reset()
      clock.Start()
      For i As Int32 = 1 To 1000000
          applies = MyDS.AC17NextClaims.Rows.Contains(myClaim.idData)
      Next
      clock.Stop()
      Dim timeSpan5 As String = "Timespan 5: " & clock.Elapsed.TotalMilliseconds.ToString & " ms"
      

        在我看来,您提供的工作似乎不足以获得有用的时间安排。你所有的时间都是亚毫秒,几乎可以肯定的是噪音缓存、jit、抢占等等

        Dim applies As Boolean
        Dim clock As New System.Diagnostics.Stopwatch
        
        clock.Start()
        For i As Int32 = 1 To 1000000
            applies = sortedListAC17NextClaims.ContainsKey(myClaim.idData)
        Next
        clock.Stop()
        Dim timeSpan1 As String = "Timespan 1: " & clock.Elapsed.TotalMilliseconds.ToString & " ms"
        
        clock.Reset()
        clock.Start()
        For i As Int32 = 1 To 1000000
            applies = listAC17NextClaims.Contains(myClaim.idData)
        Next
        clock.Stop()
        Dim timeSpan2 As String = "Timespan 2: " & clock.Elapsed.TotalMilliseconds.ToString & " ms"
        
        clock.Reset()
        clock.Start()
        For i As Int32 = 1 To 1000000
            applies = Not MyDS.AC17NextClaims.FindByIdData(myClaim.idData) Is Nothing
        Next
        clock.Stop()
        Dim timeSpan3 As String = "Timespan 3: " & clock.Elapsed.TotalMilliseconds.ToString & " ms"
        
        clock.Reset()
        clock.Start()
        For i As Int32 = 1 To 1000000
            applies = MyDS.AC17NextClaims.Select("idData=" & myClaim.idData).Length > 0
        Next
        clock.Stop()
        Dim timeSpan4 As String = "Timespan 4: " & clock.Elapsed.TotalMilliseconds.ToString & " ms"
        
        clock.Reset()
        clock.Start()
        For i As Int32 = 1 To 1000000
            applies = MyDS.AC17NextClaims.Rows.Contains(myClaim.idData)
        Next
        clock.Stop()
        Dim timeSpan5 As String = "Timespan 5: " & clock.Elapsed.TotalMilliseconds.ToString & " ms"
        

        使您的集合足够大,可以运行几秒钟,或者至少在一个紧循环中运行每个测试足够多的时间,可以运行几秒钟。

        如前所述,您的代码只运行一次操作。通常的策略是多次运行代码(例如,执行3次搜索)以获得更大的数字(因此,如果3次搜索需要0.9秒,则可以说一次搜索需要0.3秒)。然后将此循环几次,以允许您计算平均值(如果您愿意,包括标准偏差,以过滤掉任意结果),然后在此基础上,运行一次,而不必注意记录时间,以便执行任何JIT

        Dim applies As Boolean
        Dim clock As New System.Diagnostics.Stopwatch
        
        clock.Start()
        For i As Int32 = 1 To 1000000
            applies = sortedListAC17NextClaims.ContainsKey(myClaim.idData)
        Next
        clock.Stop()
        Dim timeSpan1 As String = "Timespan 1: " & clock.Elapsed.TotalMilliseconds.ToString & " ms"
        
        clock.Reset()
        clock.Start()
        For i As Int32 = 1 To 1000000
            applies = listAC17NextClaims.Contains(myClaim.idData)
        Next
        clock.Stop()
        Dim timeSpan2 As String = "Timespan 2: " & clock.Elapsed.TotalMilliseconds.ToString & " ms"
        
        clock.Reset()
        clock.Start()
        For i As Int32 = 1 To 1000000
            applies = Not MyDS.AC17NextClaims.FindByIdData(myClaim.idData) Is Nothing
        Next
        clock.Stop()
        Dim timeSpan3 As String = "Timespan 3: " & clock.Elapsed.TotalMilliseconds.ToString & " ms"
        
        clock.Reset()
        clock.Start()
        For i As Int32 = 1 To 1000000
            applies = MyDS.AC17NextClaims.Select("idData=" & myClaim.idData).Length > 0
        Next
        clock.Stop()
        Dim timeSpan4 As String = "Timespan 4: " & clock.Elapsed.TotalMilliseconds.ToString & " ms"
        
        clock.Reset()
        clock.Start()
        For i As Int32 = 1 To 1000000
            applies = MyDS.AC17NextClaims.Rows.Contains(myClaim.idData)
        Next
        clock.Stop()
        Dim timeSpan5 As String = "Timespan 5: " & clock.Elapsed.TotalMilliseconds.ToString & " ms"
        

        另外,在没有附加调试程序的情况下以发布模式运行代码。

        为什么不使用具有作为基础数据结构的集合(
        字典
        哈希集
        )<代码>哈希表应该提供
        O(1)
        查找时间,如果键中没有冲突(如您所述),并且不需要“排序”开销

        Dim applies As Boolean
        Dim clock As New System.Diagnostics.Stopwatch
        
        clock.Start()
        For i As Int32 = 1 To 1000000
            applies = sortedListAC17NextClaims.ContainsKey(myClaim.idData)
        Next
        clock.Stop()
        Dim timeSpan1 As String = "Timespan 1: " & clock.Elapsed.TotalMilliseconds.ToString & " ms"
        
        clock.Reset()
        clock.Start()
        For i As Int32 = 1 To 1000000
            applies = listAC17NextClaims.Contains(myClaim.idData)
        Next
        clock.Stop()
        Dim timeSpan2 As String = "Timespan 2: " & clock.Elapsed.TotalMilliseconds.ToString & " ms"
        
        clock.Reset()
        clock.Start()
        For i As Int32 = 1 To 1000000
            applies = Not MyDS.AC17NextClaims.FindByIdData(myClaim.idData) Is Nothing
        Next
        clock.Stop()
        Dim timeSpan3 As String = "Timespan 3: " & clock.Elapsed.TotalMilliseconds.ToString & " ms"
        
        clock.Reset()
        clock.Start()
        For i As Int32 = 1 To 1000000
            applies = MyDS.AC17NextClaims.Select("idData=" & myClaim.idData).Length > 0
        Next
        clock.Stop()
        Dim timeSpan4 As String = "Timespan 4: " & clock.Elapsed.TotalMilliseconds.ToString & " ms"
        
        clock.Reset()
        clock.Start()
        For i As Int32 = 1 To 1000000
            applies = MyDS.AC17NextClaims.Rows.Contains(myClaim.idData)
        Next
        clock.Stop()
        Dim timeSpan5 As String = "Timespan 5: " & clock.Elapsed.TotalMilliseconds.ToString & " ms"
        
        编辑:如果您只想存储密钥,则应使用.NET 3.5及更高版本中提供的

        Dim applies As Boolean
        Dim clock As New System.Diagnostics.Stopwatch
        
        clock.Start()
        For i As Int32 = 1 To 1000000
            applies = sortedListAC17NextClaims.ContainsKey(myClaim.idData)
        Next
        clock.Stop()
        Dim timeSpan1 As String = "Timespan 1: " & clock.Elapsed.TotalMilliseconds.ToString & " ms"
        
        clock.Reset()
        clock.Start()
        For i As Int32 = 1 To 1000000
            applies = listAC17NextClaims.Contains(myClaim.idData)
        Next
        clock.Stop()
        Dim timeSpan2 As String = "Timespan 2: " & clock.Elapsed.TotalMilliseconds.ToString & " ms"
        
        clock.Reset()
        clock.Start()
        For i As Int32 = 1 To 1000000
            applies = Not MyDS.AC17NextClaims.FindByIdData(myClaim.idData) Is Nothing
        Next
        clock.Stop()
        Dim timeSpan3 As String = "Timespan 3: " & clock.Elapsed.TotalMilliseconds.ToString & " ms"
        
        clock.Reset()
        clock.Start()
        For i As Int32 = 1 To 1000000
            applies = MyDS.AC17NextClaims.Select("idData=" & myClaim.idData).Length > 0
        Next
        clock.Stop()
        Dim timeSpan4 As String = "Timespan 4: " & clock.Elapsed.TotalMilliseconds.ToString & " ms"
        
        clock.Reset()
        clock.Start()
        For i As Int32 = 1 To 1000000
            applies = MyDS.AC17NextClaims.Rows.Contains(myClaim.idData)
        Next
        clock.Stop()
        Dim timeSpan5 As String = "Timespan 5: " & clock.Elapsed.TotalMilliseconds.ToString & " ms"
        
        在分类列表上:

        Dim applies As Boolean
        Dim clock As New System.Diagnostics.Stopwatch
        
        clock.Start()
        For i As Int32 = 1 To 1000000
            applies = sortedListAC17NextClaims.ContainsKey(myClaim.idData)
        Next
        clock.Stop()
        Dim timeSpan1 As String = "Timespan 1: " & clock.Elapsed.TotalMilliseconds.ToString & " ms"
        
        clock.Reset()
        clock.Start()
        For i As Int32 = 1 To 1000000
            applies = listAC17NextClaims.Contains(myClaim.idData)
        Next
        clock.Stop()
        Dim timeSpan2 As String = "Timespan 2: " & clock.Elapsed.TotalMilliseconds.ToString & " ms"
        
        clock.Reset()
        clock.Start()
        For i As Int32 = 1 To 1000000
            applies = Not MyDS.AC17NextClaims.FindByIdData(myClaim.idData) Is Nothing
        Next
        clock.Stop()
        Dim timeSpan3 As String = "Timespan 3: " & clock.Elapsed.TotalMilliseconds.ToString & " ms"
        
        clock.Reset()
        clock.Start()
        For i As Int32 = 1 To 1000000
            applies = MyDS.AC17NextClaims.Select("idData=" & myClaim.idData).Length > 0
        Next
        clock.Stop()
        Dim timeSpan4 As String = "Timespan 4: " & clock.Elapsed.TotalMilliseconds.ToString & " ms"
        
        clock.Reset()
        clock.Start()
        For i As Int32 = 1 To 1000000
            applies = MyDS.AC17NextClaims.Rows.Contains(myClaim.idData)
        Next
        clock.Stop()
        Dim timeSpan5 As String = "Timespan 5: " & clock.Elapsed.TotalMilliseconds.ToString & " ms"
        
        对SortedList对象的操作 比计算机上的操作慢 哈希表对象,因为 分类

        Dim applies As Boolean
        Dim clock As New System.Diagnostics.Stopwatch
        
        clock.Start()
        For i As Int32 = 1 To 1000000
            applies = sortedListAC17NextClaims.ContainsKey(myClaim.idData)
        Next
        clock.Stop()
        Dim timeSpan1 As String = "Timespan 1: " & clock.Elapsed.TotalMilliseconds.ToString & " ms"
        
        clock.Reset()
        clock.Start()
        For i As Int32 = 1 To 1000000
            applies = listAC17NextClaims.Contains(myClaim.idData)
        Next
        clock.Stop()
        Dim timeSpan2 As String = "Timespan 2: " & clock.Elapsed.TotalMilliseconds.ToString & " ms"
        
        clock.Reset()
        clock.Start()
        For i As Int32 = 1 To 1000000
            applies = Not MyDS.AC17NextClaims.FindByIdData(myClaim.idData) Is Nothing
        Next
        clock.Stop()
        Dim timeSpan3 As String = "Timespan 3: " & clock.Elapsed.TotalMilliseconds.ToString & " ms"
        
        clock.Reset()
        clock.Start()
        For i As Int32 = 1 To 1000000
            applies = MyDS.AC17NextClaims.Select("idData=" & myClaim.idData).Length > 0
        Next
        clock.Stop()
        Dim timeSpan4 As String = "Timespan 4: " & clock.Elapsed.TotalMilliseconds.ToString & " ms"
        
        clock.Reset()
        clock.Start()
        For i As Int32 = 1 To 1000000
            applies = MyDS.AC17NextClaims.Rows.Contains(myClaim.idData)
        Next
        clock.Stop()
        Dim timeSpan5 As String = "Timespan 5: " & clock.Elapsed.TotalMilliseconds.ToString & " ms"
        

        要以.NET 2.0为目标,您可以使用自己的或使用类似的预构建版本(您也可以轻松地使用源代码)。

        JITing已经包括在内,他运行了5次,然而,是的,通常的做法是进行多次运行并计算平均运行时间。他在那里的时间低于70秒-我认为这种计时技术(或Windows上的任何其他计时技术)的有用分辨率不会下降到这样的程度。不清楚这5次运行是否在同一个VM实例中。如果他重新执行问题中的代码,那么每次都会进行JIT,不是吗?1000000次迭代确实会带来很大的不同。现在结果变为ContainsKey方法(看看我的更新)。对-但别忘了,这仍然告诉您,使用该方法搜索6K个项目的列表1000000次更快,而不是一次搜索60亿个项目的列表是最快的方法。您可能主要测量算法的启动时间,而不是其搜索性能。这就是为什么O(f(n))符号只是故事的一部分——因为实时可能更接近O(f(n))+K,如果n很小,K可能占主导地位。最后一次做一次,表中有6亿项,se
        Dim applies As Boolean
        Dim clock As New System.Diagnostics.Stopwatch
        
        clock.Start()
        For i As Int32 = 1 To 1000000
            applies = sortedListAC17NextClaims.ContainsKey(myClaim.idData)
        Next
        clock.Stop()
        Dim timeSpan1 As String = "Timespan 1: " & clock.Elapsed.TotalMilliseconds.ToString & " ms"
        
        clock.Reset()
        clock.Start()
        For i As Int32 = 1 To 1000000
            applies = listAC17NextClaims.Contains(myClaim.idData)
        Next
        clock.Stop()
        Dim timeSpan2 As String = "Timespan 2: " & clock.Elapsed.TotalMilliseconds.ToString & " ms"
        
        clock.Reset()
        clock.Start()
        For i As Int32 = 1 To 1000000
            applies = Not MyDS.AC17NextClaims.FindByIdData(myClaim.idData) Is Nothing
        Next
        clock.Stop()
        Dim timeSpan3 As String = "Timespan 3: " & clock.Elapsed.TotalMilliseconds.ToString & " ms"
        
        clock.Reset()
        clock.Start()
        For i As Int32 = 1 To 1000000
            applies = MyDS.AC17NextClaims.Select("idData=" & myClaim.idData).Length > 0
        Next
        clock.Stop()
        Dim timeSpan4 As String = "Timespan 4: " & clock.Elapsed.TotalMilliseconds.ToString & " ms"
        
        clock.Reset()
        clock.Start()
        For i As Int32 = 1 To 1000000
            applies = MyDS.AC17NextClaims.Rows.Contains(myClaim.idData)
        Next
        clock.Stop()
        Dim timeSpan5 As String = "Timespan 5: " & clock.Elapsed.TotalMilliseconds.ToString & " ms"