JavaScript: быстрые циклы

length в JavaScript — штука медленная. Это очень хорошо видно по скорости выполнения циклов. Вовремя заменив for на while, можно получить выигрыш в производительности в 7 раз.

В умелых руках циклы JavaScript прекрасно заменяют друг друга. А значит, есть повод дополнить старый постинг о среднем арифметическом.

var digitRegEx=/^-?d+([,.]d+)?$/g;
function arithmeticMean() {
  var len = arguments.length, i = len, finalSum = 0;
  (!i) && return 0;
  while (i--)
    if (digitRegEx.test(arguments[i]))
      finalSum += parseFloat(arguments[i]);
  return (len) ? finalSum / len : 0;
}

Кстати, как народная, так и более-менее проектная реализация всяких дополнительных функций для IE грешат for по lenght и ужасающе медленным trim(). Если руки дойдут — надо бу исправить.

JavaScript: быстрый парсинг числа

Как вы думаете, как быстрее парсить число с плавающей точкой — вот так:

function isNumber(n) {
    if (n == null) return null;
    var num_parsed = parseFloat(n);
    return (!isNaN(num_parsed) && isFinite(n)) ?  true : false;
}

Или так (reg­Exp немного исправлен по сравнению с примером с суммой, чтобы уважить сербов):

var digitRegEx=/^-?d+([,.](d+)?)?$/g;
function isNumberRegExp(n) {
    return digitRegEx.test(n);
}

По идее, reg­Exp должен работать медленней. А на самом деле скорость почти одинакова. Такие дела.

JavaScript: переменные в RegExp

Reg­Exp-переменные для string.replace() в JavaScript от автора известной мануалки.

  • $1: 1-ая группа
  • $99: 99-ая группа. Если группы 99 нет — 9-ая и 9. Если 9-ой нет — просто 99 долларов
  • $+: Группа с максимальным номером.
  • $&: Весь Reg­Exp. Никакого $0 нет!!!
  • $‘ (back­tick): Слева от Reg­Exp-а.
  • $’ (sin­gle quote): Справа от Reg­Exp-а.
  • $_: Вся строка, на которую натравили Reg­Exp

JavaScript: concat для getElementsByTagName

Иногда гибкость JavaScript немного обманывает. Например, все знают, что getEle­ments­By­Tag­Name возвращает вроде бы массив. И если нам нужно получить все input и textarea, то мы посмотрим в справке, что есть фунция con­cat и — склеим!

Увы, нас ждёт разочарование. То, что приходит — это набор, но не совсем массив. Его надо преобразовывать в Array и уже потом склеивать.

Как склеивать? Обычно рекомендуют Array.prototype.slice.call(document.getElementsByTagName(‘input’), 0) или немыслимое [].slice.call(document.getElementsByTagName(‘input’), 0). Это работает во всех браузерах, кроме… IE. IE считает, что COM-объект HTML­Col­lec­tion вовсе не обзательно будет массивом. И бросает ошибку “JScript object expect­ed.”.

Поэтому мы расширим функцию из предыдущего примера ещё одной полезной тулзой.

function toArray(obj) {
    var array = [];
    for (var i = 0; obj.length && i < obj.length; i++)
      array[i] = obj[i];
    return array;
  }

func­tion setRead­On­ly(){
var item = document.getElementsByTagName(‘input’);
var el, els = toArray(document.getElementsByTagName(‘input’)).concat(toArray(document.getElementsByTagName(‘textarea’)));
for(el in els)
if(els[el].readOnly && typeof(els[el].className) != “unde­fined”)
els[el].className += ’ read­on­ly’;
}

C++: Размер массива, switch в одну строку и cдвиги

Размер массива в C/C++:

MyHugeStructure array[100];
int array_size = sizeof(array)/sizeof(*array);
for(int i = 0; i < array_size; i++)
array[i].id = i;

Следующие два варианта актуальны и для других языков.

Switch в одну строку с поддержкой всех типов:

str = number == 1 ? "one" : 
      number == 2 ? "two" :
      number == 3 ? "three" :
      number == 4 || rand() == 42 ? "four" :
      number == 5 ? "five" :
      "unknown number";

Стандарт C — штука нестрогая. Например, char — это не 1 байт, не 2 и не 4. char — это sizeof(char) и единственное ограничение: sizeof(char) < sizeof(int). Вспоминаем, что из себя представляют числа в памяти и поэтому НИКОГДА не пытаемся поделить на 2 через сдвиг отрицательное число.

//ТАК ДЕЛАТЬ НЕЛЬЗЯ!!
int a = -2;
printf("%dn", a >> 1);

Взято отсюда