nix-оболочка замедляет выполнение программы

#nix #clash #nix-shell

#nix #столкновение #nix-оболочка

Вопрос:

Я работаю с clash (haskell -> verilog), собираю демонстрационный проект по адресуhttps://github.com/mheinzel/clash-yosys-demo предоставляет как nix ветвление, так и одно использование stack .

Выполняется

 time clash -v --verilog src/Top.hs -outputdir build
  

занимает

  • ~ 1 м, если я запущу ее внутри nix-оболочки, по сравнению с
  • ~ 2 секунды, если я использую версию, которую я установил с stack install --resolver lts-12.12 clash-ghc

Я в значительной степени новичок в Nix и использую Nixpkgs, так что кто-нибудь может дать мне указания, где посмотреть, почему моя версия среды Nix намного медленнее? Кажется, что связывание используемых библиотек занимает целую вечность (это то, что я получил от использования -v , флага verbose).

Комментарии:

1. Я бы обратился к sysdig для этого анализа, чтобы получить представление о том, что происходит в процессе. Это не общая проблема nix — это может быть специфично для clash или какого-либо другого конкретного инструментария, но действительно нужно немного доработать его, чтобы задать более сфокусированный вопрос.

2. Я голосую за закрытие этого вопроса, потому что ссылка мертва (репозиторий, на который она указывает, также был удален с тех пор), поэтому в нем нет минимального воспроизводимого примера. Однако это вполне обоснованный и актуальный вопрос, и его можно было бы превратить в более общий, поскольку эта проблема специфична не для Haskell, Clash или любого конкретного программного обеспечения или пакета, а для языка деривации Nix и / или того, как работает Nix. (См., например,, discourse.nixos.org/t/why-does-nix-shell-take-so-long/8530 )

3. @toraritte, когда ты редактировал это, оно переместилось на главную страницу.

4. @toraritte, … тем не менее, повторите: «разве механизм не тот же?» — я не уверен, что понимаю. Создание чего-то вроде pkgs.mkShell деривации требует компиляции всего, что входит в эту деривацию, но как только деривация построена и вы активировали оболочку, то по большей части она действует как любой другой процесс; у вас есть динамическое связывание на основе rpath, длинная PATH переменная и некоторые другие изменения, которые действительно влияют на производительность среды выполнения, но это сильно отличается от производительности процесса построения деривации и ее зависимостей, и это последнее описано в ссылке

5. обычно время, затрачиваемое на PATH поисковые запросы и т.п., тривиально, поэтому снижение производительности во время выполнения из-за выполнения действий способом Nix в конечном итоге становится незаметным, за исключением микропереметок, предназначенных для его подчеркивания; таким образом, обычно заканчивается значительным снижением времени сборки, но незаметным во время выполнения).