Clojure 使用compojure路由/资源和环的资源加载时间非常慢
免责声明:我对clojure很陌生 我突然遇到了一个问题,加载我的clojurescript应用程序需要15秒才能加载所有库代码。第二个项目,以同样的方式建立,没有这些问题 CLJS构建:Clojure 使用compojure路由/资源和环的资源加载时间非常慢,clojure,leiningen,clojurescript,ring,compojure,Clojure,Leiningen,Clojurescript,Ring,Compojure,免责声明:我对clojure很陌生 我突然遇到了一个问题,加载我的clojurescript应用程序需要15秒才能加载所有库代码。第二个项目,以同样的方式建立,没有这些问题 CLJS构建: :cljsbuild {:builds [{:id "dev" :source-paths ["src/cljs"] :compiler {:output-to "resources/public/app/j
:cljsbuild {:builds [{:id "dev"
:source-paths ["src/cljs"]
:compiler {:output-to "resources/public/app/js/app.js"
:output-dir "resources/public/app/js/out"
:optimizations :none
:source-map true}}]}
handler.clj
(GET "/" [] (resource-response "index.html" {:root "public/app"}))
(route/resources "/" {:root "public/app"})
(route/not-found "Not Found"))
我的第一个想法是,每次我访问页面时,它都会以某种方式重新编译所有内容,但未更改库的文件时间戳没有改变
第二个想法是,这可能是因为我的浏览器中的缓存被杀死,但即使通过开发人员工具允许缓存,文件加载时间仍然很慢
第三个想法是两个项目之间的compojure版本差异,但即使将第二个项目升级到最新版本,或者将第一个项目降级到以前的版本,问题仍然存在
在进行监视时,我还注意到java进程在页面访问上跳到了350%的CPU
我试图恢复我所做的所有更改,但无法找出问题所在。由于对clojure和clojurescript非常陌生,我已经没有想法了。很明显,我不能在每次加载页面时都等待15秒,只为了在控制台中看到一条消息
/EDIT:
Project.clj
(defproject picky "0.1.0-SNAPSHOT"
:description "project"
:url "http://example.com/FIXME"
:source-paths ["src/clj"]
:dependencies [[org.clojure/clojure "1.6.0"]
[org.clojure/tools.reader "0.8.2"]
[org.clojure/clojurescript "0.0-2371"]
[org.clojure/core.async "0.1.346.0-17112a-alpha"]
[ring/ring-core "1.3.1"]
[ring/ring-json "0.3.1"]
[compojure "1.2.1"]
[korma "0.4.0"]
[org.postgresql/postgresql "9.2-1002-jdbc4"]
[com.cemerick/friend "0.2.1"]
[lobos "1.0.0-beta3"]
[cljs-http "0.1.20"]
[secretary "1.2.1"]
[om "0.3.6"]
[com.facebook/react "0.8.0.1"]
[hiccup "1.0.5"]]
:plugins [[lein-cljsbuild "1.0.3"]
[lein-ring "0.8.13"]
[lein-pdo "0.1.1"]]
:aliases {"up" ["pdo" "cljsbuild" "auto" "dev," "ring" "server-headless"]}
:ring {:handler myapp.handler/app}
:profiles
{:dev {:dependencies [[javax.servlet/servlet-api "2.5"]
[ring-mock "0.1.5"]]}}
:cljsbuild {:builds [{:id "dev"
:source-paths ["src/cljs"]
:compiler {:output-to "resources/public/js/app.js"
:output-dir "resources/public/js/out"
:optimizations :none
:source-map true}}]}
中间件是
wrap-json-body
和wrap-json-response
,尽管我已经尝试禁用了这两种 我发现了这次巨大性能损失的罪魁祸首。经过大量的调试,我发现项目1和项目2之间的唯一区别是resources文件夹
项目1包括整个前端项目。通过bower、scss、编译的css、编译的cljs等创建了大量文件。良好前端开发所需的一切。总共10506个文件
项目2是一个测试项目,包括一些HTML、javascript和编译的cljs文件总共142个文件
为了进行测试,我从resources文件夹和ta daa中移出了一些文件,文件负载下降到了几毫秒。将这些文件移回resources文件夹,性能就会受到影响
我将在compojure项目中提交一份bug报告。可能是他们还不知道的事情 这并不是很多信息。你能粘贴你的项目吗?或者,您使用的是什么版本的Ring/Compojure/Clojure/Java,应用的是哪些中间件,为您的应用提供服务的是什么HTTP服务器,等等。。。您粘贴的代码片段看起来不错,问题基本上可能存在于管道中的任何位置。:)@xsc粘贴了整个project.clj文件。由于项目仍处于早期开发阶段,我正在通过默认的环形服务器headless为所有内容提供服务。中间件是
wrap-json-body
和wrap-json-response
,但删除这两个中间件并没有帮助。另外,第二个项目也在使用这两种方法,没有任何问题。有什么想法吗?对不起,不知道。我看到您正在加载129个文件,这可能会给服务器带来一些压力(尽管不应该)。也就是说,如果每个文件需要100毫秒才能加载,并且服务器按顺序为它们提供服务,那么您可能会到达现在的位置。但这充其量只是一个未经证实的猜测。找到了问题的根源。看到我的答案了吗?那真的不是个问题,是吗?如果您要提供大量数据,您必须等待数据到达。我不会同时访问这些文件,所以老实说,我不认为文件系统中存在的文件会导致如此大的性能下降。无论如何,在将问题提交给compojure之后,结果证明它与java类pathI-see中的文件量有关。有趣的是,资源查找时间会受到可用文件数量的影响。如果必须检查大量JAR指数,我预计情况会恶化,但在这种情况下不会。请记住这一点,谢谢您的跟进。:)