XML deserializing for embedded resources slow down app startup in Xamarin Forms
up vote
0
down vote
favorite
I am working on a mobile application with Xamarin Forms for Android and iOS devices. There are two XML files (each around 12MB) that contain translation among two languages. Currently these files are embedded resources in the shared project and are deserialized in order to be used inside the application. I have made a (singleton) resource manager to search for translations in these files. The manager always run an initialize method at startup to deserialize the XML files and to prevent loading the XML files for every single time that a word should be searched. This increases the startup time; iOS on iPhone 8 takes 7s and Android on Samsung galaxy S8 takes 17s.
My questions:
- Is it correct to use these files as embedded resources in the shared project? If not what is the best practice to minimize the startup?
- Is reading and deserializing the XML files the best way to use those files?
Note that I have already searched but did not come to any conclusion from an experience point of view. Any advice (specially with some examples) is appreciated.
Update:
Here is a sample from the XMl file. But keep in mind that there are more than 50000 <word>
tags in the original XML file.
<?xml version="1.0" encoding="utf-8"?>
<MyDictionary>
<word class="nn" comment="även samklang av andra sinnesintryck; allmänt &quot;överensstämmelse&quot;" lang="sv" value="harmoni">
<translation comment="also used of harmony of other sensory impressions; generally, &quot;agreement&quot;" value="harmony" />
<phonetic soundFile="harmoni.swf" value="harmonI:" />
<paradigm>
<inflection value="harmonien" />
<inflection value="harmonier" />
</paradigm>
<synonym level="4.4" value="balans" />
<synonym level="3.2" value="endräkt" />
<synonym level="3.8" value="samklang" />
<synonym level="3.3" value="samspel" />
<synonym level="3.4" value="sämja" />
<synonym level="3.0" value="välbefinnande" />
<see type="saldo" value="harmoni||harmoni..1||harmoni..nn.1" />
<example value="leva i harmoni med naturen">
<translation value="be at one with Nature" />
</example>
<derivation inflection="harmoniskt" value="harmonisk">
<translation value="harmonious; harmonic" />
</derivation>
<definition value="samklang av toner">
<translation value="the simultaneous combination of musical tones" />
</definition>
</word>
</MyDictionary>
For deserializing, first a model/object of the XML file has been made by using Paste Special (Paste XML as classes) function in Visual Studio. Then following method is used to perform the deserializing.
private MyDictionary Load(string fileName)
{
try
{
var ass = IntrospectionExtensions.GetTypeInfo(typeof(App)).Assembly;
var resourceName = $"LexinApp.XmlResources.{fileName}";
using (Stream stream = ass.GetManifestResourceStream(resourceName))
{
using (StreamReader reader = new StreamReader(stream))
{
var serializer = new XmlSerializer(typeof(MyDictionary));
return serializer.Deserialize(reader) as MyDictionary;
}
}
}
catch (Exception) { }
return null;
}
After that a word is searched by
var a = MyDictionary.word.Where(x => x.value == searchKey.ToLower()).ToList();
xml performance xamarin.forms startup embedded-resource
add a comment |
up vote
0
down vote
favorite
I am working on a mobile application with Xamarin Forms for Android and iOS devices. There are two XML files (each around 12MB) that contain translation among two languages. Currently these files are embedded resources in the shared project and are deserialized in order to be used inside the application. I have made a (singleton) resource manager to search for translations in these files. The manager always run an initialize method at startup to deserialize the XML files and to prevent loading the XML files for every single time that a word should be searched. This increases the startup time; iOS on iPhone 8 takes 7s and Android on Samsung galaxy S8 takes 17s.
My questions:
- Is it correct to use these files as embedded resources in the shared project? If not what is the best practice to minimize the startup?
- Is reading and deserializing the XML files the best way to use those files?
Note that I have already searched but did not come to any conclusion from an experience point of view. Any advice (specially with some examples) is appreciated.
Update:
Here is a sample from the XMl file. But keep in mind that there are more than 50000 <word>
tags in the original XML file.
<?xml version="1.0" encoding="utf-8"?>
<MyDictionary>
<word class="nn" comment="även samklang av andra sinnesintryck; allmänt &quot;överensstämmelse&quot;" lang="sv" value="harmoni">
<translation comment="also used of harmony of other sensory impressions; generally, &quot;agreement&quot;" value="harmony" />
<phonetic soundFile="harmoni.swf" value="harmonI:" />
<paradigm>
<inflection value="harmonien" />
<inflection value="harmonier" />
</paradigm>
<synonym level="4.4" value="balans" />
<synonym level="3.2" value="endräkt" />
<synonym level="3.8" value="samklang" />
<synonym level="3.3" value="samspel" />
<synonym level="3.4" value="sämja" />
<synonym level="3.0" value="välbefinnande" />
<see type="saldo" value="harmoni||harmoni..1||harmoni..nn.1" />
<example value="leva i harmoni med naturen">
<translation value="be at one with Nature" />
</example>
<derivation inflection="harmoniskt" value="harmonisk">
<translation value="harmonious; harmonic" />
</derivation>
<definition value="samklang av toner">
<translation value="the simultaneous combination of musical tones" />
</definition>
</word>
</MyDictionary>
For deserializing, first a model/object of the XML file has been made by using Paste Special (Paste XML as classes) function in Visual Studio. Then following method is used to perform the deserializing.
private MyDictionary Load(string fileName)
{
try
{
var ass = IntrospectionExtensions.GetTypeInfo(typeof(App)).Assembly;
var resourceName = $"LexinApp.XmlResources.{fileName}";
using (Stream stream = ass.GetManifestResourceStream(resourceName))
{
using (StreamReader reader = new StreamReader(stream))
{
var serializer = new XmlSerializer(typeof(MyDictionary));
return serializer.Deserialize(reader) as MyDictionary;
}
}
}
catch (Exception) { }
return null;
}
After that a word is searched by
var a = MyDictionary.word.Where(x => x.value == searchKey.ToLower()).ToList();
xml performance xamarin.forms startup embedded-resource
Could you show the code which does the deserializing or at least if that is too much an abbreviated version of it? In terms of performance due my experience is that using XDocument and XPath has a big impact on performance, since gathering the XDocument from the xml file is quite consuming. Even though it is a bit more work, you get an impressive performance gain by parsing the document "manually" using a XmlReader and creating the classes while running through the document tree.
– Markus Michel
Nov 9 at 8:22
@MarkusMichel Thanks for your answer. I have updated my question with further information.
– utvecklare
Nov 9 at 8:52
add a comment |
up vote
0
down vote
favorite
up vote
0
down vote
favorite
I am working on a mobile application with Xamarin Forms for Android and iOS devices. There are two XML files (each around 12MB) that contain translation among two languages. Currently these files are embedded resources in the shared project and are deserialized in order to be used inside the application. I have made a (singleton) resource manager to search for translations in these files. The manager always run an initialize method at startup to deserialize the XML files and to prevent loading the XML files for every single time that a word should be searched. This increases the startup time; iOS on iPhone 8 takes 7s and Android on Samsung galaxy S8 takes 17s.
My questions:
- Is it correct to use these files as embedded resources in the shared project? If not what is the best practice to minimize the startup?
- Is reading and deserializing the XML files the best way to use those files?
Note that I have already searched but did not come to any conclusion from an experience point of view. Any advice (specially with some examples) is appreciated.
Update:
Here is a sample from the XMl file. But keep in mind that there are more than 50000 <word>
tags in the original XML file.
<?xml version="1.0" encoding="utf-8"?>
<MyDictionary>
<word class="nn" comment="även samklang av andra sinnesintryck; allmänt &quot;överensstämmelse&quot;" lang="sv" value="harmoni">
<translation comment="also used of harmony of other sensory impressions; generally, &quot;agreement&quot;" value="harmony" />
<phonetic soundFile="harmoni.swf" value="harmonI:" />
<paradigm>
<inflection value="harmonien" />
<inflection value="harmonier" />
</paradigm>
<synonym level="4.4" value="balans" />
<synonym level="3.2" value="endräkt" />
<synonym level="3.8" value="samklang" />
<synonym level="3.3" value="samspel" />
<synonym level="3.4" value="sämja" />
<synonym level="3.0" value="välbefinnande" />
<see type="saldo" value="harmoni||harmoni..1||harmoni..nn.1" />
<example value="leva i harmoni med naturen">
<translation value="be at one with Nature" />
</example>
<derivation inflection="harmoniskt" value="harmonisk">
<translation value="harmonious; harmonic" />
</derivation>
<definition value="samklang av toner">
<translation value="the simultaneous combination of musical tones" />
</definition>
</word>
</MyDictionary>
For deserializing, first a model/object of the XML file has been made by using Paste Special (Paste XML as classes) function in Visual Studio. Then following method is used to perform the deserializing.
private MyDictionary Load(string fileName)
{
try
{
var ass = IntrospectionExtensions.GetTypeInfo(typeof(App)).Assembly;
var resourceName = $"LexinApp.XmlResources.{fileName}";
using (Stream stream = ass.GetManifestResourceStream(resourceName))
{
using (StreamReader reader = new StreamReader(stream))
{
var serializer = new XmlSerializer(typeof(MyDictionary));
return serializer.Deserialize(reader) as MyDictionary;
}
}
}
catch (Exception) { }
return null;
}
After that a word is searched by
var a = MyDictionary.word.Where(x => x.value == searchKey.ToLower()).ToList();
xml performance xamarin.forms startup embedded-resource
I am working on a mobile application with Xamarin Forms for Android and iOS devices. There are two XML files (each around 12MB) that contain translation among two languages. Currently these files are embedded resources in the shared project and are deserialized in order to be used inside the application. I have made a (singleton) resource manager to search for translations in these files. The manager always run an initialize method at startup to deserialize the XML files and to prevent loading the XML files for every single time that a word should be searched. This increases the startup time; iOS on iPhone 8 takes 7s and Android on Samsung galaxy S8 takes 17s.
My questions:
- Is it correct to use these files as embedded resources in the shared project? If not what is the best practice to minimize the startup?
- Is reading and deserializing the XML files the best way to use those files?
Note that I have already searched but did not come to any conclusion from an experience point of view. Any advice (specially with some examples) is appreciated.
Update:
Here is a sample from the XMl file. But keep in mind that there are more than 50000 <word>
tags in the original XML file.
<?xml version="1.0" encoding="utf-8"?>
<MyDictionary>
<word class="nn" comment="även samklang av andra sinnesintryck; allmänt &quot;överensstämmelse&quot;" lang="sv" value="harmoni">
<translation comment="also used of harmony of other sensory impressions; generally, &quot;agreement&quot;" value="harmony" />
<phonetic soundFile="harmoni.swf" value="harmonI:" />
<paradigm>
<inflection value="harmonien" />
<inflection value="harmonier" />
</paradigm>
<synonym level="4.4" value="balans" />
<synonym level="3.2" value="endräkt" />
<synonym level="3.8" value="samklang" />
<synonym level="3.3" value="samspel" />
<synonym level="3.4" value="sämja" />
<synonym level="3.0" value="välbefinnande" />
<see type="saldo" value="harmoni||harmoni..1||harmoni..nn.1" />
<example value="leva i harmoni med naturen">
<translation value="be at one with Nature" />
</example>
<derivation inflection="harmoniskt" value="harmonisk">
<translation value="harmonious; harmonic" />
</derivation>
<definition value="samklang av toner">
<translation value="the simultaneous combination of musical tones" />
</definition>
</word>
</MyDictionary>
For deserializing, first a model/object of the XML file has been made by using Paste Special (Paste XML as classes) function in Visual Studio. Then following method is used to perform the deserializing.
private MyDictionary Load(string fileName)
{
try
{
var ass = IntrospectionExtensions.GetTypeInfo(typeof(App)).Assembly;
var resourceName = $"LexinApp.XmlResources.{fileName}";
using (Stream stream = ass.GetManifestResourceStream(resourceName))
{
using (StreamReader reader = new StreamReader(stream))
{
var serializer = new XmlSerializer(typeof(MyDictionary));
return serializer.Deserialize(reader) as MyDictionary;
}
}
}
catch (Exception) { }
return null;
}
After that a word is searched by
var a = MyDictionary.word.Where(x => x.value == searchKey.ToLower()).ToList();
xml performance xamarin.forms startup embedded-resource
xml performance xamarin.forms startup embedded-resource
edited Nov 20 at 12:53
asked Nov 9 at 8:16
utvecklare
42611023
42611023
Could you show the code which does the deserializing or at least if that is too much an abbreviated version of it? In terms of performance due my experience is that using XDocument and XPath has a big impact on performance, since gathering the XDocument from the xml file is quite consuming. Even though it is a bit more work, you get an impressive performance gain by parsing the document "manually" using a XmlReader and creating the classes while running through the document tree.
– Markus Michel
Nov 9 at 8:22
@MarkusMichel Thanks for your answer. I have updated my question with further information.
– utvecklare
Nov 9 at 8:52
add a comment |
Could you show the code which does the deserializing or at least if that is too much an abbreviated version of it? In terms of performance due my experience is that using XDocument and XPath has a big impact on performance, since gathering the XDocument from the xml file is quite consuming. Even though it is a bit more work, you get an impressive performance gain by parsing the document "manually" using a XmlReader and creating the classes while running through the document tree.
– Markus Michel
Nov 9 at 8:22
@MarkusMichel Thanks for your answer. I have updated my question with further information.
– utvecklare
Nov 9 at 8:52
Could you show the code which does the deserializing or at least if that is too much an abbreviated version of it? In terms of performance due my experience is that using XDocument and XPath has a big impact on performance, since gathering the XDocument from the xml file is quite consuming. Even though it is a bit more work, you get an impressive performance gain by parsing the document "manually" using a XmlReader and creating the classes while running through the document tree.
– Markus Michel
Nov 9 at 8:22
Could you show the code which does the deserializing or at least if that is too much an abbreviated version of it? In terms of performance due my experience is that using XDocument and XPath has a big impact on performance, since gathering the XDocument from the xml file is quite consuming. Even though it is a bit more work, you get an impressive performance gain by parsing the document "manually" using a XmlReader and creating the classes while running through the document tree.
– Markus Michel
Nov 9 at 8:22
@MarkusMichel Thanks for your answer. I have updated my question with further information.
– utvecklare
Nov 9 at 8:52
@MarkusMichel Thanks for your answer. I have updated my question with further information.
– utvecklare
Nov 9 at 8:52
add a comment |
1 Answer
1
active
oldest
votes
up vote
0
down vote
accepted
My best guess is that the xmlserializer isn't the fastest of its kind, especially since your word class has some degree of complexity.
As I already suggested in my comment, you might get quite a performance gain by ditching the xml serializer, write a custom xml parser based on XmlReader and push your data through it.
Another (or additional) idea to detach the serialization of your xml from your app's startup time would be loading your xml in an async background task so your main UI won't have to wait for it and since you have two files, you could also try loading them using parallel threading (using System.Collections.Concurrent):
string xmlFileNames = new string { "filenameA.xml", "filenameB.xml" };
Parallel.ForEach(xmlFileNames, xmlFile =>
{
Load(xmlFile);
});
OK! I'll give this a try. But is it good idea at all to have the XML files as embedded resources?
– utvecklare
Nov 9 at 9:15
Definitely. First, that is no dynamic content so it is a good idea to have it shipped within your app and second putting it into shared code instead of placing it within the native implementations saves you from the necessity of having to make the same changes to two files and enables you to just change one file instead and having the changes in all your resulting app versions. Actually I am currently implementing a localization plugin (based on json though, since our API uses the json format alread) in a similar way.
– Markus Michel
Nov 9 at 9:23
Parallel.Foreach
changed the iOS app startup from 7s to 5s and Android app startup from 17s to 9s. I call this a good improvement. Thanks for your answers.
– utvecklare
Nov 9 at 22:13
You're welcome. Glad to hear it worked.
– Markus Michel
Nov 9 at 22:20
Investigated the issue more. Turned out .NET XMLSerializer is too slow when it comes to the deserializing. ThenonStart()
of my shared project had simply called theInitialize()
method of DatabaseHandler. It was in theInitialize()
method thatParallel.ForEach
was called. This further improved by running theInitialize()
on a Task likeTask.Run(() => DatabaseHandler.Instance.Initialize());
. This helped significantly a lot to show the fully functional UI. Meanwhile the XML files get deserialized without interrupting the UI. Now iOS loads in 1.5s and Android in 2.5s.
– utvecklare
Nov 20 at 9:51
add a comment |
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
0
down vote
accepted
My best guess is that the xmlserializer isn't the fastest of its kind, especially since your word class has some degree of complexity.
As I already suggested in my comment, you might get quite a performance gain by ditching the xml serializer, write a custom xml parser based on XmlReader and push your data through it.
Another (or additional) idea to detach the serialization of your xml from your app's startup time would be loading your xml in an async background task so your main UI won't have to wait for it and since you have two files, you could also try loading them using parallel threading (using System.Collections.Concurrent):
string xmlFileNames = new string { "filenameA.xml", "filenameB.xml" };
Parallel.ForEach(xmlFileNames, xmlFile =>
{
Load(xmlFile);
});
OK! I'll give this a try. But is it good idea at all to have the XML files as embedded resources?
– utvecklare
Nov 9 at 9:15
Definitely. First, that is no dynamic content so it is a good idea to have it shipped within your app and second putting it into shared code instead of placing it within the native implementations saves you from the necessity of having to make the same changes to two files and enables you to just change one file instead and having the changes in all your resulting app versions. Actually I am currently implementing a localization plugin (based on json though, since our API uses the json format alread) in a similar way.
– Markus Michel
Nov 9 at 9:23
Parallel.Foreach
changed the iOS app startup from 7s to 5s and Android app startup from 17s to 9s. I call this a good improvement. Thanks for your answers.
– utvecklare
Nov 9 at 22:13
You're welcome. Glad to hear it worked.
– Markus Michel
Nov 9 at 22:20
Investigated the issue more. Turned out .NET XMLSerializer is too slow when it comes to the deserializing. ThenonStart()
of my shared project had simply called theInitialize()
method of DatabaseHandler. It was in theInitialize()
method thatParallel.ForEach
was called. This further improved by running theInitialize()
on a Task likeTask.Run(() => DatabaseHandler.Instance.Initialize());
. This helped significantly a lot to show the fully functional UI. Meanwhile the XML files get deserialized without interrupting the UI. Now iOS loads in 1.5s and Android in 2.5s.
– utvecklare
Nov 20 at 9:51
add a comment |
up vote
0
down vote
accepted
My best guess is that the xmlserializer isn't the fastest of its kind, especially since your word class has some degree of complexity.
As I already suggested in my comment, you might get quite a performance gain by ditching the xml serializer, write a custom xml parser based on XmlReader and push your data through it.
Another (or additional) idea to detach the serialization of your xml from your app's startup time would be loading your xml in an async background task so your main UI won't have to wait for it and since you have two files, you could also try loading them using parallel threading (using System.Collections.Concurrent):
string xmlFileNames = new string { "filenameA.xml", "filenameB.xml" };
Parallel.ForEach(xmlFileNames, xmlFile =>
{
Load(xmlFile);
});
OK! I'll give this a try. But is it good idea at all to have the XML files as embedded resources?
– utvecklare
Nov 9 at 9:15
Definitely. First, that is no dynamic content so it is a good idea to have it shipped within your app and second putting it into shared code instead of placing it within the native implementations saves you from the necessity of having to make the same changes to two files and enables you to just change one file instead and having the changes in all your resulting app versions. Actually I am currently implementing a localization plugin (based on json though, since our API uses the json format alread) in a similar way.
– Markus Michel
Nov 9 at 9:23
Parallel.Foreach
changed the iOS app startup from 7s to 5s and Android app startup from 17s to 9s. I call this a good improvement. Thanks for your answers.
– utvecklare
Nov 9 at 22:13
You're welcome. Glad to hear it worked.
– Markus Michel
Nov 9 at 22:20
Investigated the issue more. Turned out .NET XMLSerializer is too slow when it comes to the deserializing. ThenonStart()
of my shared project had simply called theInitialize()
method of DatabaseHandler. It was in theInitialize()
method thatParallel.ForEach
was called. This further improved by running theInitialize()
on a Task likeTask.Run(() => DatabaseHandler.Instance.Initialize());
. This helped significantly a lot to show the fully functional UI. Meanwhile the XML files get deserialized without interrupting the UI. Now iOS loads in 1.5s and Android in 2.5s.
– utvecklare
Nov 20 at 9:51
add a comment |
up vote
0
down vote
accepted
up vote
0
down vote
accepted
My best guess is that the xmlserializer isn't the fastest of its kind, especially since your word class has some degree of complexity.
As I already suggested in my comment, you might get quite a performance gain by ditching the xml serializer, write a custom xml parser based on XmlReader and push your data through it.
Another (or additional) idea to detach the serialization of your xml from your app's startup time would be loading your xml in an async background task so your main UI won't have to wait for it and since you have two files, you could also try loading them using parallel threading (using System.Collections.Concurrent):
string xmlFileNames = new string { "filenameA.xml", "filenameB.xml" };
Parallel.ForEach(xmlFileNames, xmlFile =>
{
Load(xmlFile);
});
My best guess is that the xmlserializer isn't the fastest of its kind, especially since your word class has some degree of complexity.
As I already suggested in my comment, you might get quite a performance gain by ditching the xml serializer, write a custom xml parser based on XmlReader and push your data through it.
Another (or additional) idea to detach the serialization of your xml from your app's startup time would be loading your xml in an async background task so your main UI won't have to wait for it and since you have two files, you could also try loading them using parallel threading (using System.Collections.Concurrent):
string xmlFileNames = new string { "filenameA.xml", "filenameB.xml" };
Parallel.ForEach(xmlFileNames, xmlFile =>
{
Load(xmlFile);
});
edited Nov 9 at 9:31
answered Nov 9 at 9:06
Markus Michel
1,358214
1,358214
OK! I'll give this a try. But is it good idea at all to have the XML files as embedded resources?
– utvecklare
Nov 9 at 9:15
Definitely. First, that is no dynamic content so it is a good idea to have it shipped within your app and second putting it into shared code instead of placing it within the native implementations saves you from the necessity of having to make the same changes to two files and enables you to just change one file instead and having the changes in all your resulting app versions. Actually I am currently implementing a localization plugin (based on json though, since our API uses the json format alread) in a similar way.
– Markus Michel
Nov 9 at 9:23
Parallel.Foreach
changed the iOS app startup from 7s to 5s and Android app startup from 17s to 9s. I call this a good improvement. Thanks for your answers.
– utvecklare
Nov 9 at 22:13
You're welcome. Glad to hear it worked.
– Markus Michel
Nov 9 at 22:20
Investigated the issue more. Turned out .NET XMLSerializer is too slow when it comes to the deserializing. ThenonStart()
of my shared project had simply called theInitialize()
method of DatabaseHandler. It was in theInitialize()
method thatParallel.ForEach
was called. This further improved by running theInitialize()
on a Task likeTask.Run(() => DatabaseHandler.Instance.Initialize());
. This helped significantly a lot to show the fully functional UI. Meanwhile the XML files get deserialized without interrupting the UI. Now iOS loads in 1.5s and Android in 2.5s.
– utvecklare
Nov 20 at 9:51
add a comment |
OK! I'll give this a try. But is it good idea at all to have the XML files as embedded resources?
– utvecklare
Nov 9 at 9:15
Definitely. First, that is no dynamic content so it is a good idea to have it shipped within your app and second putting it into shared code instead of placing it within the native implementations saves you from the necessity of having to make the same changes to two files and enables you to just change one file instead and having the changes in all your resulting app versions. Actually I am currently implementing a localization plugin (based on json though, since our API uses the json format alread) in a similar way.
– Markus Michel
Nov 9 at 9:23
Parallel.Foreach
changed the iOS app startup from 7s to 5s and Android app startup from 17s to 9s. I call this a good improvement. Thanks for your answers.
– utvecklare
Nov 9 at 22:13
You're welcome. Glad to hear it worked.
– Markus Michel
Nov 9 at 22:20
Investigated the issue more. Turned out .NET XMLSerializer is too slow when it comes to the deserializing. ThenonStart()
of my shared project had simply called theInitialize()
method of DatabaseHandler. It was in theInitialize()
method thatParallel.ForEach
was called. This further improved by running theInitialize()
on a Task likeTask.Run(() => DatabaseHandler.Instance.Initialize());
. This helped significantly a lot to show the fully functional UI. Meanwhile the XML files get deserialized without interrupting the UI. Now iOS loads in 1.5s and Android in 2.5s.
– utvecklare
Nov 20 at 9:51
OK! I'll give this a try. But is it good idea at all to have the XML files as embedded resources?
– utvecklare
Nov 9 at 9:15
OK! I'll give this a try. But is it good idea at all to have the XML files as embedded resources?
– utvecklare
Nov 9 at 9:15
Definitely. First, that is no dynamic content so it is a good idea to have it shipped within your app and second putting it into shared code instead of placing it within the native implementations saves you from the necessity of having to make the same changes to two files and enables you to just change one file instead and having the changes in all your resulting app versions. Actually I am currently implementing a localization plugin (based on json though, since our API uses the json format alread) in a similar way.
– Markus Michel
Nov 9 at 9:23
Definitely. First, that is no dynamic content so it is a good idea to have it shipped within your app and second putting it into shared code instead of placing it within the native implementations saves you from the necessity of having to make the same changes to two files and enables you to just change one file instead and having the changes in all your resulting app versions. Actually I am currently implementing a localization plugin (based on json though, since our API uses the json format alread) in a similar way.
– Markus Michel
Nov 9 at 9:23
Parallel.Foreach
changed the iOS app startup from 7s to 5s and Android app startup from 17s to 9s. I call this a good improvement. Thanks for your answers.– utvecklare
Nov 9 at 22:13
Parallel.Foreach
changed the iOS app startup from 7s to 5s and Android app startup from 17s to 9s. I call this a good improvement. Thanks for your answers.– utvecklare
Nov 9 at 22:13
You're welcome. Glad to hear it worked.
– Markus Michel
Nov 9 at 22:20
You're welcome. Glad to hear it worked.
– Markus Michel
Nov 9 at 22:20
Investigated the issue more. Turned out .NET XMLSerializer is too slow when it comes to the deserializing. Then
onStart()
of my shared project had simply called the Initialize()
method of DatabaseHandler. It was in the Initialize()
method that Parallel.ForEach
was called. This further improved by running the Initialize()
on a Task like Task.Run(() => DatabaseHandler.Instance.Initialize());
. This helped significantly a lot to show the fully functional UI. Meanwhile the XML files get deserialized without interrupting the UI. Now iOS loads in 1.5s and Android in 2.5s.– utvecklare
Nov 20 at 9:51
Investigated the issue more. Turned out .NET XMLSerializer is too slow when it comes to the deserializing. Then
onStart()
of my shared project had simply called the Initialize()
method of DatabaseHandler. It was in the Initialize()
method that Parallel.ForEach
was called. This further improved by running the Initialize()
on a Task like Task.Run(() => DatabaseHandler.Instance.Initialize());
. This helped significantly a lot to show the fully functional UI. Meanwhile the XML files get deserialized without interrupting the UI. Now iOS loads in 1.5s and Android in 2.5s.– utvecklare
Nov 20 at 9:51
add a comment |
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53222022%2fxml-deserializing-for-embedded-resources-slow-down-app-startup-in-xamarin-forms%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Could you show the code which does the deserializing or at least if that is too much an abbreviated version of it? In terms of performance due my experience is that using XDocument and XPath has a big impact on performance, since gathering the XDocument from the xml file is quite consuming. Even though it is a bit more work, you get an impressive performance gain by parsing the document "manually" using a XmlReader and creating the classes while running through the document tree.
– Markus Michel
Nov 9 at 8:22
@MarkusMichel Thanks for your answer. I have updated my question with further information.
– utvecklare
Nov 9 at 8:52