Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 03.01.2013, 13:25
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

Ксать parseInt() почти в два раза быстрее чем Math.floor(),
посколь без округлений
// ------------------------------ Моё ------------------------------

var factorize = ( function ( maxNumber ) {

  var primesMapSize = Math.ceil( Math.sqrt( maxNumber ) );
  var primesMap = [ void 0, true ];
  var primesList = [];

  for ( var number = 2; number <= primesMapSize; number++ ) {

    if ( primesMap[ number ] === false ) {
      continue;
    }

    primesList.push( number );
    primesMap[ number ] = true;

    for ( var next = number * 2; next <= primesMapSize; next += number ) {
      primesMap[ next ] = false;
    }
  }

  maxNumber = primesMapSize * primesMapSize;

  return function ( number ) {

    if ( !isFinite( number = +number ) || number < 1 || number != Math.floor( number ) ) {
      return Number.NaN;
    }
    if ( number > maxNumber ) {
      return false;
    }
    if ( number == 1 ) {
      return [];
    }
    if ( number <= primesMapSize && primesMap[ number ] == true ) {
      return [ { factor : number, times : 1 } ];
    }

    var maxPrime = Math.floor( Math.sqrt( number ) );
    var prime;
    var primeId = 0;
    var factor;
    var factors = [];

    while ( ( prime = primesList[ primeId++ ] ) <= maxPrime ) {

      if ( number % prime == 0 ) {

        factors.push( factor = { factor : prime, times : 1 } );

        while ( ( number /= prime ) % prime == 0 ) {
          factor.times++;
        }

        if ( number == 1 ) {
          return factors;
        }

        maxPrime = Math.floor( Math.sqrt( number ) );
      }
    }

    factors.push( { factor : number, times : 1 } );
    return factors;
  };

})( Math.pow( 2, 40 ) );

function normalizeSqrt ( number ) {

  var factors = factorize( number );

  if ( typeof factors == "number" && isNaN( factors ) ) {
    return "invalid number";
  }
  if ( factors === false ) {
    return "number too big";
  }

  var rational = 1;
  var irrational = 1;
  var factor;

  while ( factor = factors.pop() ) {

    rational *= Math.pow( factor.factor, factor.times >> 1 );

    if ( factor.times & 1 ) {
      irrational *= factor.factor;
    }
  }

  return rational + " * sqrt( " + irrational + " )";
}

// ------------------------------ Deff'а ------------------------------

function Tstsqrt(Z) {
   var a = parseInt(Math.sqrt(Z));
   if(a<2) return false;
   for(var i=a; i>=2; i--){
      var j=Z/(i*i);
      if(parseInt(j)==j){
         return (i+' * sqrt( '+j+' )');
      }
   } return false;
}

// ------------------------------ Бенчмарк ------------------------------

var numbers = [
  906972642240,
  1099505336329,
  1099505336330,
  1099505336331,
  1099505336332,
  1099505336333,
  Math.pow( 2, 40 ) - 1
];

function test ( title, func ) {

  var result = title + "\n\n";
  var timeStart = +new Date();

  for ( var i = 0; i < numbers.length; i++ ) {
    result += numbers[ i ] + " : " + func( numbers[ i ] ) + "\n";
  }

  result += "\nTime: " + ( ( +new Date() - timeStart ) / 1000 ).toFixed( 3 ) + " sec.";
  return result;
}

alert( test( "normalizeSqrt", normalizeSqrt ) + "\n\n\n\n" + test( "Tstsqrt", Tstsqrt ) );
Ответить с цитированием
  #12 (permalink)  
Старый 03.01.2013, 13:44
Аватар для Дзен-трансгуманист
√₋̅₁̅
Отправить личное сообщение для Дзен-трансгуманист Посмотреть профиль Найти все сообщения от Дзен-трансгуманист
 
Регистрация: 18.06.2012
Сообщений: 385

Сообщение от Deff
Ксать parseInt() почти в два раза быстрее чем Math.floor(),
посколь без округлений
Я-то как раз и заменил его, потому что Tstsqrt с Math.floor у меня в FF на 30% быстрее чем с ParseInt. ParseInt ведь, по идее, преобразует число в строку на входе, что само по себе тяжелее. Возможно движок вашего браузера оптимизирует код не только по "факту", но еще и по "смыслу", то есть не гоняет преобразования типов, а подставляет оптимизированную для такого сценария конструкцию.
__________________

Гейзенберг, возможно, читал этот тред.
Ответить с цитированием
  #13 (permalink)  
Старый 03.01.2013, 13:52
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

Сообщение от Дзен-трансгуманист
возможно движок вашего браузера ...
Возможно, - цифра изменилась с 0.32 на 0.186 /Oprera 12.12
Ответить с цитированием
  #14 (permalink)  
Старый 03.01.2013, 16:27
Аватар для Demath
Профессор
Отправить личное сообщение для Demath Посмотреть профиль Найти все сообщения от Demath
 
Регистрация: 22.06.2012
Сообщений: 168

Всем спасибо! Всё работает, как нужно.


P.S. Deff, Вам плюс не ставится - сообщает, что мало раздал другим, что бы поставить Вам((
Ответить с цитированием
  #15 (permalink)  
Старый 03.01.2013, 16:34
Профессор
Посмотреть профиль Найти все сообщения от godofjavascript
 
Регистрация: 11.12.2012
Сообщений: 265

Дзен-трансгуманист,
круто)
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Прижать часть строки влево, а часть вправо - как? GRIG (X)HTML/CSS 10 15.03.2012 16:12
$.ajax работает без success но при этом часть кода перезагружается!? saturn Элементы интерфейса 0 16.10.2011 10:09
Вырезать часть HTML-структуры slivka_83 Общие вопросы Javascript 3 27.10.2009 11:26