<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Гайдар Магдануров : JavaScript</title><link>http://blogs.msdn.com/gaidar/archive/tags/JavaScript/default.aspx</link><description>Tags: JavaScript</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>Игры с производительностью if...else и switch в JavaScript</title><link>http://blogs.msdn.com/gaidar/archive/2008/04/25/8424172.aspx</link><pubDate>Fri, 25 Apr 2008 17:49:51 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8424172</guid><dc:creator>gaidar</dc:creator><slash:comments>4</slash:comments><comments>http://blogs.msdn.com/gaidar/comments/8424172.aspx</comments><wfw:commentRss>http://blogs.msdn.com/gaidar/commentrss.aspx?PostID=8424172</wfw:commentRss><description>&lt;p&gt;Решил немножко поиграть с JavaScript и тем, насколько методики по улучшению производительности работают в нем. Пробовать очевидные вещи вроде вычисляния выражений в условии цикла, приводящим к постоянным вычислениям одного и того же значения, или уменьшения повторений одинаковых выражений не интересно, поэтому я решил попробовать поиграть со switch вместо комбинаций if...else в разных браузерах (IE 7 и FireFox 2).&lt;/p&gt; &lt;p&gt;Для получения результатов тестов используем простой код (Test.html):&lt;/p&gt; &lt;p&gt;&amp;lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&amp;gt;&lt;br&gt;&amp;lt;html xmlns="http://www.w3.org/1999/xhtml"&amp;gt;&lt;br&gt;&amp;lt;head&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;title&amp;gt;Test Page&amp;lt;/title&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;script type="text/javascript"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; function TestCode()&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // &amp;lt;code for testing goes here /&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; function Test()&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var i = 0;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var total = 0;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for(i = 0; i &amp;lt; 10; i++)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var sTime = new Date();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TestCode();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var eTime = new Date();&amp;nbsp; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; total += (eTime - sTime);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; testResults.innerHTML = (total / 10) + " ms";&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/script&amp;gt;&lt;br&gt;&amp;lt;/head&amp;gt;&lt;br&gt;&amp;lt;body&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;p&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;span id="testResults"&amp;gt;&amp;lt;/span&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/p&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;p&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;input type="button" onclick="Test()" value="Test" /&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/p&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/div&amp;gt;&lt;br&gt;&amp;lt;/body&amp;gt;&lt;br&gt;&amp;lt;/html&amp;gt; &lt;p&gt;Начнем с такого фрагмента, где используется последовательность if...else:&lt;/p&gt; &lt;p&gt;var test = 5;&lt;br&gt;var res = 0;&lt;br&gt;var i = 0;  &lt;p&gt;for (i=0; i &amp;lt; 100000; i++) &lt;br&gt;{ &lt;br&gt;if (test == 0) {res = test}&lt;br&gt;else if(test == 1) {res = test}&lt;br&gt;else if(test == 2) {res = test}&lt;br&gt;else if(test == 3) {res = test}&lt;br&gt;else if(test == 4) {res = test}&lt;br&gt;else if(test == 5) {res = test}&lt;br&gt;else if(test == 6) {res = test}&lt;br&gt;else if(test == 7) {res = test}&lt;br&gt;else if(test == 8) {res = test}&lt;br&gt;else if(test == 9) {res = test}&lt;br&gt;else if(test == 10) {res = test}&lt;br&gt;} &lt;p&gt;И сравним его с вот таким со switch: &lt;p&gt;var test = 5;&lt;br&gt;var res = 0;&lt;br&gt;var i = 0;  &lt;p&gt;for(i = 0; i &amp;lt; 100000; i++)&lt;br&gt;{&lt;/p&gt; &lt;p&gt;switch (test) {&lt;br&gt;case 0 : res = test; break;&lt;br&gt;case 1 : res = test; break;&lt;br&gt;case 2 : res = test; break;&lt;br&gt;case 3 : res = test; break;&lt;br&gt;case 4 : res = test; break;&lt;br&gt;case 5 : res = test; break;&lt;br&gt;case 6 : res = test; break;&lt;br&gt;case 7 : res = test; break;&lt;br&gt;case 8 : res = test; break;&lt;br&gt;case 9 : res = test; break;&lt;br&gt;case 10 : res = test; break;&lt;br&gt;} &lt;p&gt;} &lt;p&gt;И со switch с переставленными случайно значениями: &lt;p&gt;var test = 5;&lt;br&gt;var res = 0;&lt;br&gt;var i = 0;  &lt;p&gt;for(i = 0; i &amp;lt; 100000; i++)&lt;br&gt;{&lt;br&gt;switch (test) {&lt;br&gt;case 3 : res = test; break;&lt;br&gt;case 8 : res = test; break;&lt;br&gt;case 7 : res = test; break;&lt;br&gt;case 4 : res = test; break;&lt;br&gt;case 1 : res = test; break;&lt;br&gt;case 5 : res = test; break;&lt;br&gt;case 10 : res = test; break;&lt;br&gt;case 7 : res = test; break;&lt;br&gt;case 6 : res = test; break;&lt;br&gt;case 2 : res = test; break;&lt;br&gt;case 9 : res = test; break;&lt;br&gt;}&lt;br&gt;} &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;table cellspacing="0" cellpadding="2" width="323" border="0"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td valign="top" width="57"&gt;&lt;strong&gt;Вариант&lt;/strong&gt;&lt;/td&gt; &lt;td valign="top" width="140"&gt;&lt;strong&gt;IE7.0.60001.18000&lt;/strong&gt;&lt;/td&gt; &lt;td valign="top" width="124"&gt;&lt;strong&gt;FireFox 2.0.0.14&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign="top" width="59"&gt;if...else&lt;/td&gt; &lt;td valign="top" width="139"&gt;46.7 ms&lt;/td&gt; &lt;td valign="top" width="124"&gt;52.9 ms&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign="top" width="61"&gt;switch&lt;/td&gt; &lt;td valign="top" width="139"&gt;45.6 ms&lt;/td&gt; &lt;td valign="top" width="124"&gt;13.8 ms&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign="top" width="61"&gt;switch 2&lt;/td&gt; &lt;td valign="top" width="139"&gt;45.6 ms&lt;/td&gt; &lt;td valign="top" width="124"&gt;19.6 ms&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;Как видно из результатов, IE показывает стабильную производительность и не реагирует на оптимизации (и их кривизну :)). В то же время FireFox очень чувствителен к использованию switch вместо if. Теперь вот надо будет раскопать почему так происходит. Кто-нибудь может быть уже интересовался? ;)&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8424172" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/gaidar/archive/tags/Other/default.aspx">Other</category><category domain="http://blogs.msdn.com/gaidar/archive/tags/JavaScript/default.aspx">JavaScript</category></item></channel></rss>