ThinkGeo.com    |     Documentation    |     Premium Support

Using of InMemoryMarkerOverlay causes performance hit on Map loading

I am using InMemoryMarkerOverlay to display markers based on input features. However it deteriorates the loading of the map drastically from <1s sec to more than 12 secs.


Am I missing something? Please see the attached code segment.


Regards,


Anil



InMemoryMarkerOverlay.zip (31.1 KB)

Hi Anill, 
  
 We tried the code you uploaded. It runs fine on our machine. 
  
 I noticed that there are four 4 features added into the overlay, so we modified the code to add 500 features to the overlay, and it still runs fine. 
 So we’d like to know the hardware configuration of your deployment machine such as CPU, RAM or OS version etc. 
  
 Please feel free to let us know if you have any other questions. 
 Thanks, 
 Howard 


Hi Howard, 
  
 My machine configuration is as follows: 
 ============================= 
 Processor- Intel ® Core ™ i7 CPU   Q720 @1,60GHz 1.60Ghz 
 RAM  - 4.0GB 
 System Type - 64 bit operating system 
 OS - Windows 7 Professional 
 ============================= 
 Let me know if you need more info. 
 Thanks. 
 Regards, 
 Anil

 Hi Anill,


 
We have modified your code by adding 500 random markers into the marker overlay at startup; it runs fine on our test machine which is not as powerful as yours. Please try the attached sample.
 
And of course the more markers added into the map, the more Logical tree nodes need to maintain so the lower performance we get. We are confused that in your attached code, you added only four markers and it cannot be that slow you mentioned. So please confirm that the issue always happens with these four markers. Or there might be some other factors causing this issue. 
 
Looking forward your feedback.
 

post8113.zip (12.7 KB)

Hi Tsui,  
  
 Map with 500 markers takes 9-11 seconds on my machine.  
  
 After loading 500 markers, panning is ultra slow.  
 In my app, I am going to have 20-70 markers eventually so this will cause concern. 
  
 What is the typical configuration of your machines? 
  
 Note: If marker overlay is not used then mere loading of map takes less than 1 sec.  
  
 Should I send the AVI file indicating the degradation of performance on Support ticket? 
  
 Regards, 
 Anil

 Hi Anill,


 
The sample with 500 markers takes 2-3 seconds on our test machine.
Here is the configuration of the test machine:
 
Processor: Intel (R) Core (TM) 2 CPU 6300 @ 1.86Ghz
RAM: 2.99GB 
Video Card: NVIDIA GeForce 6600 LE
System: Windows XP Professional (32-bit)
 
Please notice that GPU plays an important part in WPF application because WPF uses hardware-acceleration. So we’d like to know your video card configuration.
 
And here is a recommendation to improve performance when working with markers:
When there are too many markers added to the map, they may overlap with each other at relatively lower zoom levels, and that makes it hard to tell them apart or to operate any of them. So we’d recommend you to use InMemoryFeatureLayer at lower zoom levels for speed and use InMemoryMarkerOverlay at higher zoom levels for controllability.
 
In the code attatched with this post we use an InMemoryFeatureLayer to contain markers at zoom level 1-9, and the InMemoryFeatureLayer is added to a LayerOverlay which can leverage the functionality of multi-tiling. So it would be fast to pan around at lower zoom levels.
 
 And we use an InMemoryMarkerOverlay to contan markers at zoom level 9-20. So the markers would be controllable at high levels, for example, we can add tooltips to markers.
 
Please feel free to let us know if you have any other questions.
 
Regards,
Tsui

 



001_post8113.zip (21.9 KB)

My video card is as follows:


Video card- NVIDIA Quadro FX 880M.


 





Hi Anill,


Your machine configuration seems fine, so we suspect that may be the querying process in InMemoryMarkerOverlay is causing the problem.


But we can not be sure before we narrow it down, so we’d like you to try the code snippet below; you can use it to replace the Window_Loaded method in the sample.


private void Window_Loaded(object sender, RoutedEventArgs e)
{
    wpfMap1.MapUnit = GeographyUnit.DecimalDegree;
    wpfMap1.CurrentExtent = new RectangleShape(-118.2957, 38.9791, -115.2397, 34.9452);

    SimpleMarkerOverlay simpleMarkerOverlay = new SimpleMarkerOverlay();

    Random random = new Random();
    for (int i = 0; i < 500; i++)
    {
        double x = -120 + random.NextDouble() * 3.5;
        double y = 36 + random.NextDouble() * 3.5;
        PointShape point = new PointShape(x, y);

        simpleMarkerOverlay.Markers.Add(new Marker(point)
        {
            ImageSource = new BitmapImage(new Uri("/Data1/Images/Truck.png", UriKind.RelativeOrAbsolute))
        });
    }

    wpfMap1.Overlays.Add(new WorldMapKitWmsWpfOverlay());
    wpfMap1.Overlays.Add(simpleMarkerOverlay);

    wpfMap1.Refresh();
}

In this code snippet, we use a SimpleMarkerOverlay instead of InMemoryMarkerOverlay to contain 500 random points.


SimpleMarkerOverlay is different from InMemoryMarkerOverlay; it does not need to do the querying when it redraws.


If the sample code of SimpleMarkerOverlay runs fine on your machine then we can rule out the possibility of low-performance graphic system and narrow it down to the querying process in InMemoryMarkerOverlay.


And would you please let us know how did the sample “001_post8113.zip” go? That would help to find the actual reason that’s causing the problem.


Regards,


Tsui





Hi Tsui,


Using SimplerMarkerOverlay, 500 markers load in 2-3 seconds instead of 10+ seconds (InMemoryMarkerOverlay) on my machine.


Using the sample using InMemoryMarkerOverlay on a slower machine (Duo core ) it takes 20 seconds.


Regards,


Ani



 Hi Anil, 


Now we can narrow it down to the querying process that takes place in InMemoryMarkerOverlay. 


So we’d like you to try the sample attached with this post. In this sample, we add 500 points into the InMemoryMarkerOverlay; when the button in the bottom of the window is clicked, we query all of the markers for 10 times and use a message box to show the result. 


This is the result we got from our test machine: 


Query 500 markers Cost 975 milliseconds


Query 500 markers Cost 977 milliseconds


Query 500 markers Cost 979 milliseconds


Query 500 markers Cost 985 milliseconds


Query 500 markers Cost 985 milliseconds


Query 500 markers Cost 986 milliseconds


Query 500 markers Cost 982 milliseconds


Query 500 markers Cost 975 milliseconds


Query 500 markers Cost 970 milliseconds


Query 500 markers Cost 970 milliseconds 


We hope you can run the sample without modification(like adding styles or column values, because the goal of this sample is to test the query time only) and let us know how long it takes. 


Thanks for your patience.


Regards,


Tsui




post8113_TestQuery.zip (22 KB)

Hi Tsui,


I ran the sample you send I get  result as sghown in image attached


Regards,


Anil


 



Hi Tsui, 
 I don’t whether the image got posted or not. But here are the results. 
  
 Query 500 markers Cost 870milliseconds 
 Query 500 markers Cost 959 milliseconds 
 Query 500 markers Cost 923 milliseconds 
 Query 500 markers Cost 916 milliseconds 
 Query 500 markers Cost 959 milliseconds 
 Query 500 markers Cost 935 milliseconds 
 Query 500 markers Cost 977 milliseconds 
 Query 500 markers Cost 1084 milliseconds 
 Query 500 markers Cost 1020 milliseconds 
 Query 500 markers Cost 870 milliseconds  
  
 Regards, 
 Anil

Hi Anil, 
  
 The SimplerMarkerOverlay sample takes 2-3 seconds on your machine, which means nothing is wrong with the rendering process. 
 The query sample takes approximate to 1 second on your machine, which means the querying process is fine too. 
  
 Now what seems strange is that InMemoryMarkerOverlay does nothing more than rendering and querying, but it’s taking too much time on your machine. 
  
 Earlier in this thread, you said the InMemoryMarkerOverlay sample took more than 10 seconds to load on your machine. Is this InMemoryMarkerOverlay sample exactly the one we attached in this thread?  
  
 We just want to make sure that you did not make any modification to the sample, like adding column values to the InMemoryMarkerOverlay, because that may degrade performance. 
  
 Looking forward to your reply. 
  
 Regards, 
 Tsui

Hi Tsui, 
  
  I did not make any modification in the sample and neither there is any coliumn attribute on markers. 
  Yes, InMemoryMarkerOverlay takses 10sec to load (inital loading) on my machine. subsequent refresh of the layer is okay. 
  
 Any clues what is causing this performance hit on my machine? 
  
 Regards, 
 Anil  


Hi Anil, 
  
 Thanks for you patient and you confirmation. I think we still cannot figure out if it’s only some special setting like on your machine has this issue. Because it works fine on our machine. Would you mind try some other machines and see how it works? We have tried on our virtual machine with XP and Windows7 on both X86 and X64 environment, but it causes us less than 3 seconds for 500 markers only on the extent that holds all markers. Then the more we zoom in, the faster speed we get. 
  
 Sorry for the inconvenience and looking forward your feedback. 
  
 Thanks, 
 Howard 
  


Hi Howard,


I tried on a different machines (Win7 64 bit) and got worse results as mentioned in my previous post. I will let know result once I get hold of a different machine for test.


Regards,


Anil



Hi Anil, 
  
 We still can not reproduce the problem. 
 We have asked our colleague in support team to send you a video demonstration. In the video, we ran the sample with 500 markers and it took only about 3 seconds to load. 
 If you’ve kept the avi file you mentioned before in this thread, please send it to us. 
  
 We have been using latest assemblies in the samples all along. So if you are not using the latest package of MapSuite Wpf Desktop Edition, we’d suggest you to download it from helpdesk.thinkgeo.com then replace the assembly references and try the sample again. 
  
 Thanks, 
 Tsui

Hi Tsui, 
  
 I replaced the dll build using the latest build 09/26 and the sample loading improves to 6-7seconds from the earlier 10+ seconds but still is not good enough. 
  
 How do I send large avi file to you guys? 
  
 Regards, 
 Anil

 Hi Anil,


 
You can send the avi file to support@thinkgeo.com , and ask them to forward the email to me.
 
We tried the dll package released on 9.26. The file version of WpfDesktopEdition.dll is 4.0.145.0 and assembly version is 4.0.0.0. 
We’ve tried the following combinations:
 
full version strong named release anycpu about 2 seconds
full version strong named release x86 about 2 seconds
 
full version strong named debug anycpu about 3 seconds
full version strong named debug x86 about 3 seconds
 
full version unstrong named release anycpu about 2 seconds
full version unstrong named release x86 about 2 seconds
 
full version unstrong named debug anycpu about 3 seconds
full version unstrong named debug x86 about 3 seconds
 
eval version strong named release anycpu about 3 seconds
eval version strong named release x86 about 3 seconds
 
eval version strong named debug anycpu about 3 seconds
eval version strong named debug x86 about 3 seconds
 
eval version unstrong named release anycpu about 3 seconds
eval version unstrong named release x86 about 3 seconds
 
eval version unstrong named debug anycpu about 3 seconds
eval version unstrong named debug x86 about 3 seconds
 
And all of them took about 2-3 seconds to load.
 
So we’d like to know which version of the assemblies you are using. Is it full version or evaluation version? Is it strong named or not? And did you compile the sample using release or debug? Did you use x86 or x64 or anycpu to compile it? And of course it would be event better if you can send us the compiled binaries of the sample that is performing badly on your machine.
 
Thanks,
Tsui

Hi, Anill 



We got the video and binary you emailed. Thanks. 

We’ve ran the binary you compiled; but unfortunately, we still can’t reproduce the problem you have; it took 2-3 seconds on our test machine(32-bit xp) and on some virtual machines(64-bit vista). 



A new sample is attached with this post, we added rendering test in the new sample; and here is how the rendering test went on our test machine: 



Add 500 markers to canvas  Cost 23 milliseconds 

Render 500 markers in canvas  Cost 349 milliseconds 



Add 500 markers to canvas  Cost 16 milliseconds 

Render 500 markers in canvas  Cost 368 milliseconds 



Approximately, the render process takes about 400 milliseconds. Please try the new sample and let us know how it goes. 



By the way, we’ve done some minor optimization with the pan/zoom speed for marker overlay lately; we’d suggest you to try the latest dll packages (any version after 4.0.148.0). 



Thanks, 

Tsui



post_8113_TestQueryAndRendering.zip (26.6 KB)