VS2012 Windows 8 profilēšana ar NGEN bibliotēkām

Izmantojot Visual Studio 2012 profilētāju uz Windows 8, rezultātu tabulā liela daļa bibliotēku uzrādās kā, piemēram, 'System.Web.ni.dll' – '.ni.dll' norāda, ka tas ir native image – bibliotēka, kas ģenerēta, izmantojot ngen aplikāciju.

Visual Studio ALM blogā ir aprakstīts, kā ar šo problēmu tikt galā. Diemžēl tur piemērs prasa palielu darbošanos komandrindā, apstrādājot katru bibliotēku atsevišķi. Lai tas nebūtu regulāri jādara, izveidoju nelielu PowerShell skriptu, kas to dara automātiski visām bibliotēkām, kuras šobrīd instalētas sistēmā.

Lejupielādēt skriptu. Skripta sākumā ir mainīgais, kurā jāievada sev vēlamā direktorija, nekas cits nav jāmaina, ja pieņem, ka 'C:\Windows' ir īstā direktorija.

Skriptā ir paredzēta arī funkcionalitāte, kas lejupielādē PDB ar pirmkoda informāciju no Microsoft servera un izmanto tos, lai ģenerētu jaunos, taču šobrīd tur pieejamie PDB faili kaut kādā mērā neatbilst tam, ko uzstāda .NET Framework 4.5 uz datora, līdz ar to šo funkcionalitāti nav iespējams izmantot. Ja ir vēlme paeksperimentēt, tad skriptā ir nepieciešamie komentāri.

English version

Download a PowerShell script that automatically creates PDB symbols for all NGEN-ed images on your machine. You will need to change the target path at the start of the script. If 'C:\Windows' is not your path, you will need some more modifications as well to accomodate that.

The details on this topic are available on Visual Studio ALM blog.

The script includes the functionality to download PDB files with source information from Microsoft and use those to generate the new ones. Unfortunately these PDB files do not match the files installed by .NET Framework 4.5 so the code is commented out. If you want to experiment, there are comments what needs to be done in the script.

Memory and performance of .NET dictionaries

Since generics were added to .NET everybody seems to have forgotten about all the different dictionaries available in the framework and uses Dictionary<,>. I was doing the same until recently I ran into a situation where tens of thousands of dictionaries are created and the memory usage went rather high.

In my case most of the dictionaries are rather small (mostly 2-3 items) so the first thing I tried was switching to HybridDictionary. A short test later I found out that by performing this simple switch I have reduced the memory usage by 10%.

So I went to investigate and compare the various dictionaries available in .NET both of the previously mentioned and also Hashtable, ListDictionary, OrderedDictionary, SortedDictionary, SortedList.

The test is very simple – it recursively creates dictionaries (with integers as keys) and captures both memory usage and time it took to create the dictionary and fully read it (once). Of course, each of the abovementioned classes have their specific usages, especially the sorted and ordered ones but this test only looks at a simple un-optimized scenario.

image

The first test creates small dictionaries in 9 levels (each dictionary contains 5 other dictionaries). What the results show is that HybridDictionary (together with ListDictionary that is used by it internally) takes the lead with much better timings and memory usage than the standard Dictionary<,>.

image

As expected, raising the size of each dictionary put ListDictionary in a bad position. Why SortedList with typed key has surprisingly good memory/performance ratings - it uses a simple array for storage and the test uses sequential keys that is the strong point for this class. A bit strange is the bad performance of Hashtable (memory-wise) especially since Hashtable is the class being used by HybridDictionary in this case and it does not show this weakness. It is not because of cold start as the tests were run multiple times and always produced the same result.

Obviously this needs more research and probably better ways of measuring the memory consumption (I am using GC.GetTotalMemory method) but it should be enough to remind that performance is not the only thing to measure when using lots of collections – there is a lot of memory overhead that should be investigated to find the best possible match for each scenario.

Another thing to mention is that the dictionaries increase their capacity in bulk so even if the dictionary size is 200 the capacity of the underlying data stores could as well be 300. It might seem to be a good idea to set the capacity with the appropriate constructor (as long as the maximum is known beforehand) but couple of quick tests showed that for Dictionary<,> it might produce even worse results. Although this again could be the result of suboptimal testing techniques.

Source code for the test application.

More results on different dictionary sizes.

GeoTransformer goes open source

GeoTransformer is now available at CodePlex as a open source project. This is not one those situations where “going open source” means “I’m out, if someone else wants, here”. In this case I really think that giving full access to the source code and moving to a solid platform for project maintenance will benefit the application.

The new website: http://geotransformer.codeplex.com/

What new features this move brings to the table:

  • The source code is available to everyone under Ms-RL license (in short it means that you are free to use it in any project but you have to keep the copyright headers intact).
  • Wiki based documentation (currently it is still empty but it will come there).
  • Discussions section (forum).
  • Issue tracker – place to submit bugs and feature requests.

If there is someone who wants to join the development or help write the documentation, please send me a note.

Visual Studio 11 Beta

No šodienas lejupielādei un eksperimentiem ir pieejama Visual Studio 11 un TFS 11 Beta versijas.

Neliels brīdinājums – .NET Framework 4.5 ir update 4.0 versijai (kā 3.5 pret 2.0), nevis atsevišķa versija, līdz ar to Beta instalācija (jebkura produkta, jo tiem visiem vajag .NET Framework jauno) ietekmēs visas esošās aplikācijas un Visual Studio 2010. Diemžēl uz savas ādas pārbaudīju, ka izmaiņas nav tik perfekti atpakaļsavietojamas, kā gribētos (manā konkrētā gadījumā uzrāvos uz WCF servisiem). Esošā aplikācija pēkšņi ar ļoti dīvainu kļūdu sāka nestrādāt.

Kas vēl jautri – palaižot uninstall uz 4.5 Beta, tiek atinstalēts arī viss .NET Framework 4.0…

LKS-92 koordinātu sistēma

Pētot, kā priekš savas slēpņošanas programmas iegūt Latvijas topogrāfiskās kartes, uzdūros LĢIA karšu serverim. Kas mani iepriecināja – pārsteidzoši aktuāla informācija – laukos kaimiņa nesen izraktais dīķis (ar kuru viņš appludināja daļu mūsu meža) ir jau iezīmēts.

Taču reizē ar to uzzināju kaut ko jaunu – Latvijā šādām kartēm neizmanto vis kādu no standarta koordinātu sistēmām (UTM vai WGS84 – šis ir visbiežāk sastopamais formā N 56’ 23.233’’ – to nedaudz citā pierakstā izmanto arī Google Maps un citi), bet gan savu standartu LKS-92. Cik nu varēju izlobīt, tad tas pēc būtības ir tas pats UTM, tikai, lai to izmantotu, aprēķinos ir jāizmanto specifiskas konstantes. Katrā ziņā problēma ir vienkārša – ja man ir koordinātas WGS84 formātā, uz šādas kartes tās uzlikt tik vienkārši nevar.

Pameklējos internetā, uzdūros boot.lv foruma rakstam par tēmu. Tajā atbilde netika dota, taču bija norāde uz konkrētu resursu, kurš pārrēķina ievadītās koordinātas starp dažādām sistēmām, tajā skaitā LKS-92. Tā kā visi aprēķini tika veikti JavaScript-ā, tad ar salīdzinoši nelielu darbu esmu ieguvis C# kodu, kas pārrēķina starp WGS84 un LKS-92.

Pirmkoda lejupielāde

Arhīvā ir divas klases: PointD ir vienkārša struktūra X/Y vērtību pārim, bet LKS92andWGS84 satur divas metodes konvertēšanai starp LKS-92 un WGS84 koordinātu sistēmām.

c:\windows\sysnative

Windows iekļautās programmas lielākā daļa ir atrodamas zem C:\Windows\System32 direktorijas. Uz 32bit operētājsistēmas tur būs 32bit aplikācijas, uz 64bit operētājsistēmas – 64bit aplikācijas. Uz 64bit operētājsistēmas eksistē arī direktorija C:\Windows\SysWOW64, kurā atrodas 32bit aplikāciju versijas.

Piemēram, “calc.exe” eksistē divās versijās – 32bit versija aizņem ~750Kb, bet 64bit versija ~900Kb. Izmērs nav svarīgs, tas tikai uzskatāmi parāda, ka tas nav viens un tas pats fails.

Joki šajā sakarā sākas tad, kad 32bit aplikācija cenšas palaist, piemēram, C:\Windows\System32\calc.exe. Pat precīzi norādot direktoriju, Windows ieslēdz savu automātisko maģiju un šo ceļu pārvērš ar C:\Windows\SysWOW64\calc.exe. Tas ir, operētājsistēma izdomā, ka 32bit aplikācija taču nevarētu vēlēties palaist 64bit procesu. Saprotams, ka šāda uzvedība nodrošina labāku 32bit aplikāciju darbību uz 64bit operētājsistēmas.

Taču ne visas aplikācijas ir gan 32bit, gan 64bit versijās. Kā arī noteiktas aplikācijas apzināti var vēlēties palaist noteiktu bitu aplikāciju. Uz Windows Vista un jaunākiem ir ļoti vienkāršs un elementārs veids, kā ar šo problēmu cīnīties – C:\Windows\SysNative virtuālā direktorija.

Programmēšanas e-grāmatas bez maksas

Uzgāju sarakstu ar lapām, kur var iegūt bezmaksas e-grāmatas par dažādām programmēšanas valodām un tēmām. Sarakstā ir legālas grāmatas, kas pieejamas bez maksas, nevis zagtas versijas.

http://www.devcurry.com/2010/06/collection-of-free-programming-and.html

MSSQL rezerves kopiju veidošana

Lai risinātu iepriekš aprakstītās problēmas, veidojot MSSQL automātiskās rezerves kopijas, izveidoju savu mazu programmiņu. Tās galvenās funkcijas:

  • veidot rezerves kopijas visām uz servera esošām datubāzēm;
  • apstrādāt reizē vairākus datubāzu serverus (vai instances);
  • sūtīt skaisti noformētus statusu pārskatus;
  • izdzēst novecojušas rezerves kopijas.

Lejupielāde: SqlBackup.zip (gan pirmkods, gan kompilēta versija)

Konfigurācijas fails un pirmkods ir dokumentēts pietiekoši, lai jebkurš šo kodu varētu izmantot, pielāgojot vai arī neko nemainot.

Silverlight data binding un validācija

Silverlight 3 iebūvētie data binding un ar to saistītās validācijas ir pamatīga sāpe. Pavisam vienkāršos scenārijos tā strādā kā gaidīts, bet pietiek vēlēties kaut ko nedaudz sarežģītāku, lai konstatētu, ka lielākā daļa vēlmju tā arī paliks vēlmes, jo tās realizēt ir praktiski neiespējami.

Labi raksti par šo tēmu atrodami The Joy Of Code blogā (trīs rakstu sērija). Par laimi, Silverlight 4 jau ir iznācis un praktisku iemeslu palikt pie Silverlight 3 īsti nav.

Agile

Agile nozīmē to, ka Izpildītājs smaida un piekrīt, kad Pasūtītājs kārtējo reizi maina tvērumu (scope).

Tāda diemžēl ir ļoti daudzu vadītāju uztvere, kas nav iemācījušies, ka kopā ar dažādām Agile metodoloģijām nenāk tikai iespēja mainīt prasības, bet arī daudz dažādi citi ierobežojumi un pasākumu kopumi. Paņem to, kas izdevīgi, nepaņemot to, kas nepieciešams, lai metodoloģiju veiksmīgi īstenotu.