english | блог | контакт
Tue, 24 May 2016 @ 04:21

nodejs var vs let performance

javascript nodejs performance

sometimes it really matters

$ node --version
v6.0.0
$ node
> timeit = (times, func) => {
     let start = (new Date()).getTime();
     for (let i = 0; i < times; i++) {
       func();
     };
     return (new Date()).getTime() - start;
   };
undefined
> timeit(1000000, () => {
     let sum = 0;  // <-- here's LET
     for (let i = 0; i < 1000; i++) {
       sum += i;
       if (sum > 1000000) { sum = 0; }
     }
     return sum;
   })
12144
> timeit(1000000, () => {
     var sum = 0;  // <-- here's VAR
     for (let i = 0; i < 1000; i++) {
       sum += i;
       if (sum > 1000000) { sum = 0; }
     }
     return sum;
   })
2459

Wed, 20 Nov 2013 @ 13:25

Spring, Lifecycle, destroy-методы

java spring

Сегодня обнаружили великолепный нюанс: если в spring ApplicationContext не закрывать контекст руками и при этом не зарегистрировать shutdown hook (registerShutdownHook), то он, очевидно, не закроется и все Lifecycle бины, естественно, не будут остановлены, destroy-методы не будут вызваны.
Кстати, в destroy-методах логгирование через slf4j, log4j и прочие логгеры не работает - они скорее всего уже успели закрыться в своих shutdown-хуках.

Fri, 08 Nov 2013 @ 20:22

Неожиданный синтаксис

python

На днях увидел интересный синтаксис в python-е:

a = [[1,2,3], [6,5,4], [9,8,7]]
for b in a:
   b[:] = sorted(b)
print(a)

читать дальше

Thu, 16 May 2013 @ 16:40

Date object reuse vs new instance creation

java premature optimization

Вкратце:
new Date(...) работает практически в 2 раза быстрее, чем reusableDateObject.setTime(...) при условии, что объект никуда не уходит из метода (jdk1.7.0_17, core i5-2430m, 1g heap, pargc).
Но картина резко меняется, если хранить объект между вызовами метода.
читать дальше

Thu, 22 Nov 2012 @ 08:42

Проверка корректности расстановки скобок/кавычек в строке

scala алгоритмы

Вообще-то надо было на python-е и не мне. Но, "само написалось":

val brackets = List(("(", ")"), ("[", "]"), ("{", "}"),
                    ("\"", "\""), ("'", "'"), ("`", "`"));

def checkBrackets(s:String) = {
  def check(s:String, stack:List[String]):Boolean = {
    if (s.length == 0) {
      stack.size == 0
    } else {
      val first = s.substring(0,1)
      if (stack.size > 0 && stack.first == first) {
        check(s.substring(1), stack.tail)
      } else if (brackets.exists(_._1 == first)) {
        check(s.substring(1), brackets.filter(_._1 == first)(0)._2 +: stack)
      } else if (brackets.exists(_._2 == first)) {
        false
      } else {
        check(s.substring(1), stack)
      }
    }
  }
  check(s, List[String]())
}

checkBrackets(" {({({({()})})})}")
true
checkBrackets("{(})")
false

Thu, 01 Nov 2012 @ 22:50

Joda Time performance is low

joda-time

Joda-time быстрый. И расстояния между датами он считает быстро. Но если это расстояние надо считать 1000000 и более раз в секунду, то лучше написать велосипед, маленький и более быстрый.

Thu, 23 Aug 2012 @ 14:43

Lucene 3.6, AttributeSource.getAttributeImplsIterator()

java lucene

Наступил случайно на то, что AttributeSource.getAttributeImplsIterator() не thread-safe. Суть можно выразить следующим образом:

thread1 {
  save1 = AttributeSource.getAttributeImplsIterator
  // что вызывает getCurrentState() и ждёт пока итератор не будет подготовлен
}
thread2 {
  save2 = AttributeSource.getAttributeImplsIterator
  // getCurrentState() возвращает ссылку currentState[0],
  // в которой может содержаться не до конца сформированный список для итератора,
  // где некоторые State могут даже содержать attribute == null
}

Sun, 24 Jun 2012 @ 14:38

Итерация по массиву против списка

java performance

Сравнил производительность итерирования по массиву против ArrayList-а. 8-кратное превосходство в скорости в некоторых задачах решает.
читать дальше

Thu, 18 Aug 2011 @ 15:05

Git и случайно удалённая ветка

git

Бывает, удаляешь случайно бранч с незавершённой работой и, более того, незаpushенный в апстрим. Как это сделал 10 минут назад я. Беглый поиск даёт нам команду "git reflog", которая позволяет просмотреть историю изменений бранчей и впоследствии извлечь потерянные коммиты / восстановить бранч.

# создали бранч
$ git co -b branch1
# и новый файл в нём
$ date > test2
$ git add test2
# закоммитили
$ git ci -a -m 'second'
# а бранч удалили
$ git co master
$ git branch -D branch1
# смотрим историю
$ git reflog
8bcb54d HEAD@{0}: checkout: moving from branch1 to master
931b97d HEAD@{1}: commit: second
8bcb54d HEAD@{2}: checkout: moving from master to branch1
8bcb54d HEAD@{3}: commit (initial): first
# восстанавливаем
$ git co 931b97d
$ git co -b branch1
# да здравствует git!

Wed, 20 Jul 2011 @ 09:42

Фильтрация Map-ов

collections java

При невнимательном чтении документации, можно, как это сделал я, наступить на грабли с вариантом:

org.apache.commons.collections.
   MapUtils.transformedMap(originalMap, keyTransformer, valueTransformer)

К сожалению он декорирует только добавление новых элементов. А старые остаются "как есть". Конечно, можно прогнать через трансформацию все старые значения (например, через putAll), но можно полениться и использовать Google collections, которые делают именно то, что от них ожидается:
com.google.common.collect.Maps.filterKeys(originalMap, keyPredicate)
com.google.common.collect.Maps.filterValues(originalMap, valuePredicate)
com.google.common.collect.Maps.filterEntries(originalMap, entryPredicate)

Страницы: 1 2 3 4 5 6 7 8