В своих экспериментах с взаимодействием bash / clojure я заметил, что лучшим способом может быть использование плагина lein-exec по нескольким причинам.
Во-первых, у меня пока хорошо получается.
Я также выполнил несколько команд времени из bash, чтобы почувствовать разницу между моей первоначальной идеей - которая в основном заключалась в создании шаблона lein для скриптов - с одной стороны, и lein-exec с другой.
С одной стороны, мой эксперимент. Я еще не сделал шаблон lein, но идея была в следующем:
(ns closcrite.core
(:require [clojure.java.shell :as shell])
(:gen-class))
(defn -main
"I don't do a whole lot."
[& args]
(let [shell-output (apply shell/sh args)]
(println (shell-output :out))
(shutdown-agents)))
Sexpr (shutdown-agents)
просто потому, что я столкнулся с этой проблемой.
Без (shutdown-agents)
:
lein compile && lein uberjar
&& time java -jar target/closcrite-0.1.0-SNAPSHOT-standalone.jar "ls" "-ahl"
Compiling closcrite.core
Compilation succeeded.
All namespaces already :aot compiled.
Created /home/j/Development/closcrite/target/closcrite-0.1.0-SNAPSHOT.jar
Including closcrite-0.1.0-SNAPSHOT.jar
Including clojure-1.4.0.jar
Created /home/j/Development/closcrite/target/closcrite-0.1.0-SNAPSHOT-standalone.jar
total 36K
drwxrwxr-x 6 j j 4.0K Aug 18 18:14 .
drwxrwxr-x 26 j j 4.0K Aug 18 17:55 ..
drwxrwxr-x 2 j j 4.0K Aug 18 17:55 doc
-rw-rw-r-- 1 j j 99 Aug 18 17:55 .gitignore
-rw-rw-r-- 1 j j 325 Aug 18 18:14 project.clj
-rw-rw-r-- 1 j j 199 Aug 18 17:55 README.md
drwxrwxr-x 3 j j 4.0K Aug 18 17:55 src
drwxrwxr-x 4 j j 4.0K Aug 18 18:02 target
drwxrwxr-x 3 j j 4.0K Aug 18 17:55 test
real 1m2.585s
user 0m4.188s
sys 0m0.120s
С (shutdown-agents)
:
lein compile && lein uberjar
&& time java -jar target/closcrite-0.1.0-SNAPSHOT-standalone.jar "ls" "-ahl"
Compiling closcrite.core
Compilation succeeded.
All namespaces already :aot compiled.
Created /home/j/Development/closcrite/target/closcrite-0.1.0-SNAPSHOT.jar
Including closcrite-0.1.0-SNAPSHOT.jar
Including clojure-1.4.0.jar
Created /home/j/Development/closcrite/target/closcrite-0.1.0-SNAPSHOT-standalone.jar
total 36K
drwxrwxr-x 6 j j 4.0K Aug 18 18:14 .
drwxrwxr-x 26 j j 4.0K Aug 18 17:55 ..
drwxrwxr-x 2 j j 4.0K Aug 18 17:55 doc
-rw-rw-r-- 1 j j 99 Aug 18 17:55 .gitignore
-rw-rw-r-- 1 j j 325 Aug 18 18:14 project.clj
-rw-rw-r-- 1 j j 199 Aug 18 17:55 README.md
drwxrwxr-x 3 j j 4.0K Aug 18 17:55 src
drwxrwxr-x 4 j j 4.0K Aug 18 18:02 target
drwxrwxr-x 3 j j 4.0K Aug 18 17:55 test
real 0m2.817s
user 0m3.796s
sys 0m0.084s
С другой стороны, lein-exec:
time lein exec -e "(ns blah
(:require [clojure.java.shell :as shell]))
(print ((shell/sh \"ls\" \"-ahl\") :out))"
total 36K
drwxrwxr-x 6 j j 4.0K Aug 18 18:14 .
drwxrwxr-x 26 j j 4.0K Aug 18 17:55 ..
drwxrwxr-x 2 j j 4.0K Aug 18 17:55 doc
-rw-rw-r-- 1 j j 99 Aug 18 17:55 .gitignore
-rw-rw-r-- 1 j j 325 Aug 18 18:14 project.clj
-rw-rw-r-- 1 j j 199 Aug 18 17:55 README.md
drwxrwxr-x 3 j j 4.0K Aug 18 17:55 src
drwxrwxr-x 4 j j 4.0K Aug 18 18:02 target
drwxrwxr-x 3 j j 4.0K Aug 18 17:55 test
real 0m1.371s
user 0m2.136s
sys 0m0.120s
Конечно, time
- не самое главное в профилировании, но это хороший показатель скорости. Для пользователя встроенный сценарий оболочки lein-exec чувствует себя почти в 2 раза быстрее, чем код, который я использовал для моделирования времени выполнения минимального шаблона сценария оболочки leiningen.