Clojure 使用compojure路由/资源和环的资源加载时间非常慢

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

免责声明:我对clojure很陌生

我突然遇到了一个问题,加载我的clojurescript应用程序需要15秒才能加载所有库代码。第二个项目,以同样的方式建立,没有这些问题

CLJS构建:

  :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指数,我预计情况会恶化,但在这种情况下不会。请记住这一点,谢谢您的跟进。:)