Chilkat HOME Android™ Classic ASP C C++ C# Mono C# .NET Core C# C# UWP/WinRT DataFlex Delphi ActiveX Delphi DLL Visual FoxPro Java Lianja MFC Objective-C Perl PHP ActiveX PHP Extension PowerBuilder PowerShell PureBasic CkPython Chilkat2-Python Ruby SQL Server Swift 2 Swift 3,4,5... Tcl Unicode C Unicode C++ Visual Basic 6.0 VB.NET VB.NET UWP/WinRT VBScript Xojo Plugin Node.js Excel Go
(VB.NET UWP/WinRT) XML Path Performance OptimizationsDiscusses some important things to know about using Chilkat paths in the Chilkat XML API.
Dim xml As New Chilkat.Xml ' Let's load XML containing the following: ' <?xml version="1.0" encoding="utf-8"?> ' <xyz> ' <licenses> ' <license> ' <id>1234</id> ' </license> ' <license> ' <id>1234</id> ' </license> ' ... ' My sample XML contains 64,000 "license" nodes .. ' ... ' <license> ' <id>1234</id> ' </license> ' <license> ' <id>1234</id> ' </license> ' </licenses> ' </xyz> ' Dim success As Boolean = xml.LoadXmlFile("qa_output/large.xml") If (success <> True) Then Debug.WriteLine(xml.LastErrorText) Exit Sub End If ' Iterating over the individual "license" nodes with this code snippet is ' extremely slow: Dim licCount As Integer = xml.NumChildrenHavingTag("licenses|license") Debug.WriteLine("license count = " & licCount) Dim s As String Dim i As Integer = 0 ' If "10" is changed to licCount, then it becomes apparent that this loop gets slower with each iteration. While i < 10 xml.I = i s = xml.GetChildContent("licenses|license[i]|id") Debug.WriteLine(i & ": " & s) i = i + 1 End While ' The reason it is extremely slow is that the "license[i]" part of the path passed to GetChildContent ' says: find the i'th child of "licenses" having the tag "license". Chilkat cannot assume that all ' children of an XML node have the same tag. Therefore it's not possible to directly access the i'th child. ' Internally, Chilkat must start at the 1st child and iterate until it reaches the i'th child having the ' tag "license". ' For example, imagine if the XML was like this: ' <?xml version="1.0" encoding="utf-8"?> ' <xyz> ' <licenses> ' <license> ' <id>1234</id> ' </license> ' <somethingElse> ' <a>abc</a> ' </somethingElse> ' <license> ' <id>1234</id> ' </license> ' ... ' In the above XML, the 1st "license" is the 1st child of "licenses", but the 2nd "license" ' is the 3rd child of "licenses". ' If you already know that all children have the same tag, there is a shortcut that allows ' for direct access to that child. Just leave off the tag name, like this: i = 0 ' If "10" is changed to licCount, then we can see the time for each loop is the same, and it's fast. While i < 10 xml.I = i s = xml.GetChildContent("licenses|[i]|id") Debug.WriteLine(i & ": " & s) i = i + 1 End While ' When we pass just the index "[i]", we're saying: Get the i'th child regardless of tag. ' This is extremely fast because internally we can just access the i'th child directly. ' Another performance improvement is to call NumChildrenAt rather than NumChildrenHavingTag. ' For example: licCount = xml.NumChildrenAt("licenses") Debug.WriteLine("licCount = " & licCount) ' NumChildrenAt returns the total number of children at the tag path. If we already know ' all children will have the same tag, we can just get the count |
© 2000-2022 Chilkat Software, Inc. All Rights Reserved.