{"id":798,"date":"2014-12-24T01:44:40","date_gmt":"2014-12-23T23:44:40","guid":{"rendered":"http:\/\/dev.bratched.fr\/fr\/?p=798"},"modified":"2019-07-18T22:46:10","modified_gmt":"2019-07-18T20:46:10","slug":"image-depuis-http-avec-c-xaml-comparatifs-et-performances-partie-2","status":"publish","type":"post","link":"https:\/\/bratched.com\/fr\/2014\/12\/24\/image-depuis-http-avec-c-xaml-comparatifs-et-performances-partie-2\/","title":{"rendered":"Image depuis HTTP avec C# XAML &#8211; Comparatifs et Performances &#8211; Partie 2"},"content":{"rendered":"<h1>Introduction<\/h1>\n<p><a href=\"http:\/\/dev.bratched.fr\/fr\/wp-content\/uploads\/sites\/2\/2014\/12\/bench01.png\">&nbsp;<\/a><img decoding=\"async\" loading=\"lazy\" class=\"  alignnone wp-image-801\" src=\"http:\/\/dev.bratched.fr\/fr\/wp-content\/uploads\/sites\/2\/2014\/12\/wp_ss_20141223_0001-e1419724812891-1024x933.png\" alt=\"wp_ss_20141223_0001\" width=\"480\" height=\"437\" srcset=\"https:\/\/bratched.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/12\/wp_ss_20141223_0001-e1419724812891-1024x933.png 1024w, https:\/\/bratched.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/12\/wp_ss_20141223_0001-e1419724812891-300x273.png 300w, https:\/\/bratched.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/12\/wp_ss_20141223_0001-e1419724812891-768x700.png 768w, https:\/\/bratched.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/12\/wp_ss_20141223_0001-e1419724812891.png 1080w\" sizes=\"(max-width: 480px) 100vw, 480px\" \/><\/p>\n<p>Cet article traite des r\u00e9sultats des diff\u00e9rentes m\u00e9thodes pour lire une image provenant d&rsquo;un site Http.<\/p>\n<p>Les diff\u00e9rentes impl\u00e9mentations ont \u00e9t\u00e9 d\u00e9crites dans l&rsquo;article<\/p>\n<p><a title=\"Image depuis HTTP avec C# XAML \u2013 Comparatifs et Performances \u2013 Partie 1\" href=\"http:\/\/dev.bratched.fr\/fr\/image-depuis-http-avec-c-xaml-comparatifs-et-performances-partie-1\/\">Image depuis http avec C# Xaml &#8211; comparatifs et performances<\/a>.<\/p>\n<h1>Mesures<\/h1>\n<p>L&rsquo;image \u00e9talon fait 19ko et mesure 400&#215;240 pixels. Elle est pr\u00e9sente notamment sur les serveurs de Bing \u00e0 l&rsquo;adresse suivante :<\/p>\n<p>http:\/\/www.bing.com\/az\/hprichbg\/rb\/ChristmasMarketNurnberg_FR-FR11351563819_1280x768.JPG<\/p>\n<p>Le premier test va charger 10 fois la m\u00eame image suivante :<\/p>\n<p><!--more--><\/p>\n<p><a href=\"http:\/\/dev.bratched.fr\/fr\/wp-content\/uploads\/sites\/2\/2014\/12\/ChristmasMarketNurnberg_FR-FR11351563819_400x240.jpg\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-800\" src=\"http:\/\/dev.bratched.fr\/fr\/wp-content\/uploads\/sites\/2\/2014\/12\/ChristmasMarketNurnberg_FR-FR11351563819_400x240.jpg\" alt=\"ChristmasMarketNurnberg_FR-FR11351563819_400x240\" width=\"400\" height=\"240\" srcset=\"https:\/\/bratched.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/12\/ChristmasMarketNurnberg_FR-FR11351563819_400x240.jpg 400w, https:\/\/bratched.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/12\/ChristmasMarketNurnberg_FR-FR11351563819_400x240-300x180.jpg 300w\" sizes=\"(max-width: 400px) 100vw, 400px\" \/><\/a><\/p>\n<p>Afin d&rsquo;\u00e9viter les mises en cache http d&rsquo;\u00e9changes, l&rsquo;url demand\u00e9e est accompagn\u00e9e de param\u00e8tres fictifs dans la requ\u00eate.<\/p>\n<p>Exemple : http:\/\/192.168.0.47\/ChristmasMarketNurnberg_FR-FR11351563819_400x240.jpg?test={0} o\u00f9 {0} sera remplac\u00e9 lors des tests par des donn\u00e9es uniques avec l&rsquo;instruction<\/p>\n<p><span style=\"color: #2b91af;font-family: Consolas;font-size: small\">String<\/span><span style=\"font-family: Consolas;font-size: small\">.Format(url, <\/span><span style=\"color: #2b91af;font-family: Consolas;font-size: small\">DateTime<\/span><span style=\"font-family: Consolas;font-size: small\">.Now.Ticks)<\/span><\/p>\n<p>Une m\u00e9thode g\u00e9n\u00e9rique de benchmark a \u00e9t\u00e9 r\u00e9alis\u00e9e. A titre indicatif, voici la m\u00e9thode principale.<\/p>\n<pre class=\"lang:default decode:true\">public static async Task BenchmarkTest(this IBenchmarkResult result, Func&lt;string, Task&lt;object&gt;&gt; test, string url, string title, string comment)\n{\n    await semaphore.WaitAsync();\n    try\n    {\n        string resourceName = String.Empty;\n        _buildLog.AppendLine(\"-----------------------\");\n        _buildLog.AppendLine(String.Format(\"Test {0} (x{1})\", title, _nbBench));\n        _buildLog.AppendLine(String.Format(\"-- {0} \", comment));\n        result.BenchmarkLog= _buildLog.ToString();\n        _startTime = DateTime.Now;\n        _buildLog.AppendLine(String.Format(\"Start {0:HH:mm:ss}\", _startTime));\n        int nb = 0;\n        int index = 0;\n        while (nb &gt; 0 || index &lt;= _nbBench)\n        {\n            index++;\n            if (index &lt;= _nbBench)\n            {\n                nb++;\n                {\n                    System.Diagnostics.Debug.WriteLine(\"Add test {0}, index {1}\", nb, index);\n                    result.Image = await test(String.Format(url, DateTime.Now.Ticks));\n                    nb--;\n                    System.Diagnostics.Debug.WriteLine(\"remove test {0}\", nb);\n                }\n            }\n        }\n        _buildLog.AppendLine(String.Format(\"Result {0} = {1:0.000} s\", title, (DateTime.Now - _startTime).TotalSeconds));\n        result.BenchmarkLog = _buildLog.ToString();\n    }\n    finally\n    {\n        semaphore.Release();\n    }\n}<\/pre>\n<ul>\n<li>&nbsp;Le s\u00e9maphore sert \u00e0 \u00e9viter les conflits<\/li>\n<li>La m\u00e9thode \u00e0 tester est pass\u00e9e dans la Func Test<\/li>\n<li>La boucle lance les tests \u00e0 la suite (10x pour ces tests)<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p>Pour rappel, les m\u00e9thodes test\u00e9es sont les suivantes :<\/p>\n<ol>\n<li><a title=\"Image depuis HTTP avec C# XAML \u2013 Comparatifs et Performances \u2013 Partie 1\" href=\"http:\/\/dev.bratched.fr\/fr\/image-depuis-http-avec-c-xaml-comparatifs-et-performances-partie-1\/\">Http client et DataWriter <\/a>: implementation classique avec le DataWriter<\/li>\n<li><a title=\"Image depuis HTTP avec C# XAML \u2013 Comparatifs et Performances \u2013 Partie 1\" href=\"http:\/\/dev.bratched.fr\/fr\/image-depuis-http-avec-c-xaml-comparatifs-et-performances-partie-1\/\">Http Client et AsRandomAccessStream<\/a>&nbsp; : utilisation du AsRandomAccessStream (W8.1)<\/li>\n<li><a title=\"Image depuis HTTP avec C# XAML \u2013 Comparatifs et Performances \u2013 Partie 1\" href=\"http:\/\/dev.bratched.fr\/fr\/image-depuis-http-avec-c-xaml-comparatifs-et-performances-partie-1\/\">HttpClient et AsRandomAccessStream&nbsp;avec ConfigureAwait<\/a> : optimisation avec ConfigureAwait(false)<\/li>\n<li><a title=\"Image depuis HTTP avec C# XAML \u2013 Comparatifs et Performances \u2013 Partie 1\" href=\"http:\/\/dev.bratched.fr\/fr\/image-depuis-http-avec-c-xaml-comparatifs-et-performances-partie-1\/\">HttpClient et MemoryStream dans une autre&nbsp;Task<\/a>. Le memoryStream est trait\u00e9 \u00e0 part dans une t\u00e2che asynchrone<\/li>\n<li><span style=\"color: #0088cc\">HttpRequest et MemoryStream dans une autre&nbsp;Task<\/span> Le HttpRequest est utilis\u00e9 \u00e0 la place du HttpClient<\/li>\n<li><a title=\"Image depuis HTTP avec C# XAML \u2013 Comparatifs et Performances \u2013 Partie 1\" href=\"http:\/\/dev.bratched.fr\/fr\/image-depuis-http-avec-c-xaml-comparatifs-et-performances-partie-1\/\">Actions \u00e0 la place du Async \/ Await<\/a> : Utilisation des Actions \u00e0 la place du async\/await<\/li>\n<li><span style=\"color: #0088cc\">HttpWebRequest et AsRandomAccessStream :&nbsp;<\/span><span style=\"color: #0088cc\">&nbsp;<\/span><\/li>\n<li><a title=\"Image depuis HTTP avec C# XAML \u2013 Comparatifs et Performances \u2013 Partie 1\" href=\"http:\/\/dev.bratched.fr\/fr\/image-depuis-http-avec-c-xaml-comparatifs-et-performances-partie-1\/\">HttpWebRequest et AsRandomAccessStream&nbsp;avec Action<\/a> : comme la 6 mais AsRandomAccessStream remplace la Task du MemoryStream<\/li>\n<li><a title=\"Image depuis HTTP avec C# XAML \u2013 Comparatifs et Performances \u2013 Partie 1\" href=\"http:\/\/dev.bratched.fr\/fr\/image-depuis-http-avec-c-xaml-comparatifs-et-performances-partie-1\/\">HttpWebRequest, AsRandom Access Stream sans ConfigureAwait <\/a>: Idem que la 2 mais avec HttpWebRequest<\/li>\n<\/ol>\n<h1>Test en local<\/h1>\n<p>Le test est r\u00e9alis\u00e9 sur un r\u00e9seau local, via Wifi sur un Lumia 930. Les tests ont \u00e9t\u00e9 m\u00e9lang\u00e9s (pour ne pas toujours commenc\u00e9 par le premier)<\/p>\n<p>Le serveur est situ\u00e9 sur le r\u00e9seau local.<\/p>\n<p>Le tableau repr\u00e9sente les valeurs en ms pour chaque s\u00e9rie de tests.<\/p>\n<p>Les moyennes sont sur la premi\u00e8re ligne.<\/p>\n<p><a href=\"http:\/\/dev.bratched.fr\/fr\/wp-content\/uploads\/sites\/2\/2014\/12\/bench01.png\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone wp-image-803 size-full\" src=\"http:\/\/dev.bratched.fr\/fr\/wp-content\/uploads\/sites\/2\/2014\/12\/bench01.png\" alt=\"bench01\" width=\"576\" height=\"246\" srcset=\"https:\/\/bratched.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/12\/bench01.png 576w, https:\/\/bratched.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/12\/bench01-300x128.png 300w\" sizes=\"(max-width: 576px) 100vw, 576px\" \/><\/a><\/p>\n<p>On peut d\u00e9j\u00e0 voir de gros \u00e9carts entre la premi\u00e8re m\u00e9thode traditionnelle et la 8, nous avons presque des temps qui sont divis\u00e9s par 2.<\/p>\n<p>On observe \u00e9galement que<\/p>\n<ul>\n<li>Le HttpClient est bien plus lent que le HttpRequest (ce n&rsquo;est pas une surprise)<\/li>\n<li>Les m\u00e9thodes utilisant des actions sont&nbsp;les plus rapides (pourquoi reste&nbsp;le grand&nbsp;myst\u00e8re inexpliqu\u00e9)<\/li>\n<\/ul>\n<h1>Test grandeur nature<\/h1>\n<p>Le test a ensuite \u00e9t\u00e9 r\u00e9alis\u00e9 sur des connections 3G, 4G, Wifi avec un serveur distant.<\/p>\n<p>Le serveur utilis\u00e9 est le serveur de Bing. Les temps de connexions sont bien s\u00fbr plus variables et voici les r\u00e9sultats sur une connexion H+ r\u00e9seau orange avec le 930.<\/p>\n<p>Les moyennes sont toujours&nbsp;sur la premi\u00e8re ligne.<\/p>\n<p>Peu de diff\u00e9rences avec les tests sur r\u00e9seau local.<\/p>\n<p>Les benchmarks 3, 6, 8 et 9 sont les meilleurs et seront conserv\u00e9s pour les autres tests<\/p>\n<p><a href=\"http:\/\/dev.bratched.fr\/fr\/wp-content\/uploads\/sites\/2\/2014\/12\/bench02.png\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone wp-image-804 size-full\" src=\"http:\/\/dev.bratched.fr\/fr\/wp-content\/uploads\/sites\/2\/2014\/12\/bench02.png\" alt=\"bench02\" width=\"726\" height=\"407\" srcset=\"https:\/\/bratched.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/12\/bench02.png 726w, https:\/\/bratched.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/12\/bench02-300x168.png 300w\" sizes=\"(max-width: 726px) 100vw, 726px\" \/><\/a><\/p>\n<p>Le test suivant est r\u00e9alis\u00e9 sur un 920, toujours sur un r\u00e9seau H+.<\/p>\n<p><a href=\"http:\/\/dev.bratched.fr\/fr\/wp-content\/uploads\/sites\/2\/2014\/12\/Bench3.png\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone wp-image-805 size-full\" src=\"http:\/\/dev.bratched.fr\/fr\/wp-content\/uploads\/sites\/2\/2014\/12\/Bench3.png\" alt=\"Bench3\" width=\"321\" height=\"281\" srcset=\"https:\/\/bratched.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/12\/Bench3.png 321w, https:\/\/bratched.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/12\/Bench3-300x263.png 300w\" sizes=\"(max-width: 321px) 100vw, 321px\" \/><\/a><\/p>\n<p>Sur un Lumia&nbsp;920,&nbsp;les m\u00e9thodes 6 et 8 sortent&nbsp;du lot avec un gain d&rsquo;une dizaine de pourcent.<\/p>\n<p>J&rsquo;ai pu faire des tests \u00e0 plusieurs reprises sur des r\u00e9seaux allant de la 4g au Edge et ce sont toujours ces 2&nbsp;impl\u00e9mentations qui sortent du lot.<\/p>\n<h1>Conclusion<\/h1>\n<p>Dans mes Apps, je vais utiliser l&rsquo;impl\u00e9mentation 8 qui reste simple (compar\u00e9e \u00e0 la solution 6), compr\u00e9hensible et une des plus performantes.<\/p>\n<p>Il serait int\u00e9ressant de voir \u00e9galement&nbsp;si des t\u00e9l\u00e9phones avec un processeur un peu moins performant tel que le Lumia 520 enregistrent les m\u00eames \u00e9carts.<\/p>\n<p>Le code source sera publi\u00e9 tr\u00e8s prochainement.<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Introduction &nbsp; Cet article traite des r\u00e9sultats des diff\u00e9rentes m\u00e9thodes pour lire une image provenant d&rsquo;un site Http. Les diff\u00e9rentes impl\u00e9mentations ont \u00e9t\u00e9 d\u00e9crites dans l&rsquo;article Image depuis http avec C# Xaml &#8211; comparatifs et performances. Mesures L&rsquo;image \u00e9talon fait 19ko et mesure 400&#215;240 pixels. Elle est pr\u00e9sente notamment sur les serveurs de Bing \u00e0 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":803,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[59,62,63],"tags":[68,69,83,70,77,79],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/bratched.com\/fr\/wp-json\/wp\/v2\/posts\/798"}],"collection":[{"href":"https:\/\/bratched.com\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/bratched.com\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/bratched.com\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/bratched.com\/fr\/wp-json\/wp\/v2\/comments?post=798"}],"version-history":[{"count":1,"href":"https:\/\/bratched.com\/fr\/wp-json\/wp\/v2\/posts\/798\/revisions"}],"predecessor-version":[{"id":849,"href":"https:\/\/bratched.com\/fr\/wp-json\/wp\/v2\/posts\/798\/revisions\/849"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/bratched.com\/fr\/wp-json\/wp\/v2\/media\/803"}],"wp:attachment":[{"href":"https:\/\/bratched.com\/fr\/wp-json\/wp\/v2\/media?parent=798"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/bratched.com\/fr\/wp-json\/wp\/v2\/categories?post=798"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/bratched.com\/fr\/wp-json\/wp\/v2\/tags?post=798"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}