А почему Javascript? В плане времени, 3-4мс, это ничто для интерпретируемого языка (запускал код в консоли браузера из первой ссылки). Там есть странные моменты, которые можно поправить, например вот этот `if (String(child) === String(startNode))`, или сделать поменьше операций с массивами, или заранее выделить им фиксированный размер, чтоб избежать пушей и динамического выделения памяти. Если понимаешь алгоритм, то можешь пробежаться по коду и поискать моменты, где можно отбросить ненужные итерации.