1. JavaScript / Говнокод #5316

    +169

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    function paramEncode(str){
    	var text = escape(str);
    	while(text.indexOf("%u") !=-1)
    		text = text.replace("%u","!u");
    	while(text.indexOf("%") !=-1)
    		text = text.replace("%","!u00");
            while(text.indexOf(".") !=-1)                                                                                        
                    text = text.replace(".","!u002E");   
            while(text.indexOf("/") !=-1)                                                                                        
                    text = text.replace("/","!u002F");   
    	return text;
    }

    альтернатива if:)

    Запостил: moonie, 18 Января 2011

    Комментарии (35) RSS

    • заменять пока заменяется!
      Ответить
    • Блин, тоже самое хотел написать... ))) Опередили.
      Ответить
    • вообще-то в JS replace заменяет только первое вхождение искомого выражения.

      Поэтому или регекспом, или while
      Ответить
      • тогда лучше регекспом наверное
        Ответить
        • Давно хотел сравнить по производительности
          text.replace(a/g,'A'));
          и
          while(text.indexOf('a')!=-1) text.replace('a','A');
          да пока руки не доходят
          Ответить
          • ща проверим:)
            Ответить
          • да в чем проблема. написать оба выражение в цикле на охрененное колво итераций, замерить время, и поделить )

            это дело 5-10 мин )
            Ответить
            • Проблемы нету. Вспоминаешь про этот тест, только когда заходит разговор про while/regexp. И забываешь про этот тест через минуту.

              Сам обычно реплейсаю через регекспы:)
              Ответить
              • чето браузер валится от while(text.indexOf('a')!=-1) text.replace('a','A') :)
                Ответить
                • да. забыл переприсвоить. так он в бесконечный цикл уходит
                  text = text.replace('a','A')
                  Ответить
              • <html>
                <script>
                var cnt=100000;
                var text='aaaaaaaa';
                var t1=new Date();
                for(var i=0;i<cnt;i++) {
                 text.replace(/a/g,'A');
                }
                var t2=new Date();
                document.write('re:'+(t2-t1)/cnt+' ');
                
                var t1=new Date();
                for(var i=0;i<cnt;i++) {
                 while(text.indexOf('a')!=-1) text=text.replace('a','A');
                }
                var t2=new Date();
                document.write('while:'+(t2-t1)/cnt+' ');
                </script>
                </html>


                на последнем файрфоксе под хрюшей дал
                re:0.00209 while:0.00007
                Ответить
                • while быстрее! так вот где оптимизация:)
                  Ответить
                  • впринципе, это понятно, во втором случае мы организуем тупо цикл на замещение, а не более универсальный конечный автомат, пусть и "нативный"
                    Ответить
                • Только тогда еще

                  for(var i=0;i<cnt;i++) {
                  text = text.replace(/a/g,'A');
                  }

                  Хотя и без присваивания разница заметна невооруженным глазом
                  Ответить
                  • зачем? не надо.
                    мы заменяем одной инструкцией, но текст остается исходным для второго теста
                    во втором же присвоение нужно, потому что в цикле
                    Ответить
                    • replace не меняет исходную строку вроде бы.
                      Поэтому чтобы увидеть результат, то надо переприсвоить.

                      при
                      var text='aaaaaaaa';
                      text.replace(/a/g,'A') ;

                      text будет равен 'aaaaaaaa'
                      Ответить
                      • text = text.replace(/a/g,'A');

                        text будет равен 'АААААААА', а потом тогда второй тест сфейлит, ему нечего будет заменять. Либо перед вторым тестом тоже написать var text='aaaaaaaa';
                        Ответить
                        • извини, не сразу понял смысла фразы

                          "текст остается исходным для второго теста"

                          Тогда во втором тесте замена внутри while у тебя отработает только 1 раз.

                          Значит, подсчитанное время будет неверным.

                          "Либо перед вторым тестом тоже написать var text='aaaaaaaa';" - внутри цикла по i
                          Ответить
                          • точно, недоглядел
                            <html>
                            <script>
                            var cnt=100000;
                            
                            var t1=new Date();
                            for(var i=0;i<cnt;i++) {
                             var text='aaaaaaaa';
                             text=text.replace(/a/g,'A');
                            }
                            var t2=new Date();
                            document.write(text+' re:'+(t2-t1)/cnt+' ');
                            
                            var t1=new Date();
                            for(var i=0;i<cnt;i++) {
                             var text='aaaaaaaa';
                             while(text.indexOf('a')!=-1) text=text.replace('a','A');
                            }
                            var t2=new Date();
                            document.write(text+' while:'+(t2-t1)/cnt+' ');
                            </script>
                            </html>

                            AAAAAAAA re:0.00204 AAAAAAAA while:0.00443
                            Ответить
                            • Спасибо за тест.

                              Теперь видно, что не так все хорошо с while, как казалось сразу.
                              Ответить
                            • А если ещё взять 'aaaaaaaaaaaaaaaa' или хотя бы 'bbbbbbbbaaaaaaaa'...
                              Ответить
                            • Для чистоты эксперимента можно добавить блок со split join:
                              t1=new Date();
                              for(var i=0;i<cnt;i++) {
                               var text='aaaaaaaa';
                               text=text.split('a').join('A');
                              }
                              t2=new Date();
                              document.write(text+' split:'+(t2-t1)/cnt+' ');

                              Опера пишет, что это немного медленнее, чем регулярка, но в 2 раза быстрее while.
                              Я так думаю, что на большом тексте разница будет намного заметнее. ГК защитан.
                              Ответить
    • vanished
      Ответить

    Добавить комментарий