2016-01-14 5 views
1

Я использую библиотеку GMAP.Net для приложения окна отображения. У меня около 17000 полигонов в моей базе данных Sql Server. В событии load формы я выбираю All polygons из базы данных и заполняет datatabale, а затем вытягивает полигоны один за другим из datatable. У меня также есть древовидная структура, в которую я добавляю все имена полигонов 17000 в это дерево. Теперь, когда я проверяю выбрать все флажки на TreeView вызвать функцию в Treeview node_AfterCheck случае, как это:Оптимизация вложенных циклов

Private Sub node_AfterCheck(sender As Object, e As TreeViewEventArgs)  Handles TreeView1.AfterCheck 

    If e.Action <> TreeViewAction.Unknown Then 
     Task.Factory.StartNew(Sub() 
            GetPolygons(e.Node) 
           End Sub, TaskCreationOptions.LongRunning) 
    End If 
End Sub 



Private Sub GetPolygons(node As TreeNode) 
      Dim objectId As String 
      Dim _polygon As GMapPolygon 
      For Each node1 As TreeNode In node.Nodes 
       objectId = node1.Name 

       For Each _polygon In polyOverlay.Polygons.AsParallel 
        itemTag = _polygon.Tag.ToString.Split("|") 
        If itemTag (0) = node1.Name Then 
         _polygon.IsVisible = node.Checked 
         Exit For 
        End If 
       Next 
      Next 
End sub 

этот код занимает около 40 секунд для запуска полностью. Есть ли способ оптимизировать этот код для более короткого времени?

+0

Также есть некоторые проблемы с порядком 'End If' и' Exit For'. – rdoubleui

ответ

1

Единственное, что я вижу, это дорогостоящий код - это вызов Split на теги многоугольника. Но это подлежит измерению.

Чтобы обойти Split, вы можете, например. попробуйте использовать:

If _polygon.Tag.StartsWith(node1.Name) Then 

Рассмотрим this question, чтобы выяснить, если IsPrefix еще быстрее в вашем случае.

Я предполагаю, что основной проблемой является постоянное обновление/перерисовка карты («автообновление») при настройке видимости каждого полигона. Одна вещь, которую я нашел в источниках установить Invalidation на удержание:

// docs: stops immediate markers/route/polygon invalidations; call Refresh to perform single refresh and reset incalidation state 
gmap2.HoldInvalidation = true; 

// do your update loop within here 

// docs: call this to stop HoldInvalidation and perform single forced instant refresh 
gmap2.Refresh(); 

Не имеют возможность дать ему попробовать прямо сейчас, но я думаю, вы можете пойти дальше и попытаться увидеть, если это делает разница.

0

спасибо за ваш быстрый ответ я изменил мой код, как это:

Private Sub GetPolygons(node As TreeNode) 

     myMap.HoldInvalidation = True 

     Dim objectId As String 
     Dim _polygon As GMapPolygon 
     For Each node1 As TreeNode In node.Nodes 
      objectId = node1.Name 

      For Each _polygon In polyOverlay.Polygons.AsParallel 
       itemTag = _polygon.Tag.ToString.Split("|") 
       If itemTag (0) = node1.Name Then 
        _polygon.IsVisible = node.Checked 
        Exit For 
       End If 
      Next 
     Next 

     myMap.Refresh() 

End Sub

но код занимает больше период времени, чем раньше.

+0

, заменив «_polygon.Tag.ToString.Split (« | ")» на «_polygon.Tag.StartsWith (node1.Name)» Теперь код занимает около 20 секунд, а не 40 секунд. –

+1

Хорошо, стоило попробовать. 17000 многоугольников, рад видеть, что удаление операции «Сплит» помогло, возможно, даже лучше, чем любая операция на каждой строке, подумайте, что это возможно? Сколько времени занимает эта операция? Выясните, вообще не оставляя видимость, чтобы попытаться сузить место, где находится горло бутылки. Посмотрим, откуда мы оттуда, я хочу знать. – rdoubleui

+0

Без работы на каждой строке требуется около 2 секунд! –

Смежные вопросы