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
up: fixed in 6.7.0
Spring, Lifecycle, destroy-методы
java spring
Сегодня обнаружили великолепный нюанс: если в spring ApplicationContext не закрывать контекст руками и при этом не зарегистрировать shutdown hook (registerShutdownHook), то он, очевидно, не закроется и все Lifecycle бины, естественно, не будут остановлены, destroy-методы не будут вызваны.
Кстати, в destroy-методах логгирование через slf4j, log4j и прочие логгеры не работает - они скорее всего уже успели закрыться в своих shutdown-хуках.
Неожиданный синтаксис
python
На днях увидел интересный синтаксис в python-е:
a = [[1,2,3], [6,5,4], [9,8,7]] for b in a: b[:] = sorted(b) print(a)
читать дальше
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).
Но картина резко меняется, если хранить объект между вызовами метода.
читать дальше
Проверка корректности расстановки скобок/кавычек в строке
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
Joda Time performance is low
joda-time
Joda-time быстрый. И расстояния между датами он считает быстро. Но если это расстояние надо считать 1000000 и более раз в секунду, то лучше написать велосипед, маленький и более быстрый.
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 }
Итерация по массиву против списка
java performance
Сравнил производительность итерирования по массиву против ArrayList-а. 8-кратное превосходство в скорости в некоторых задачах решает.
читать дальше
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!
Фильтрация 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)