【问题标题】:Very slow resource loading time with compojure route/resources and ring组合路由/资源和环的资源加载时间非常慢
【发布时间】:2015-01-12 13:43:24
【问题描述】:

免责声明:我对 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"))

我的第一个想法是,每次我访问该页面时它都会以某种方式重新编译所有内容,但未更改库的文件时间戳没有改变。

第二个想法是,这可能是因为我的浏览器中的缓存被杀掉了,但是即使通过开发者工具允许缓存,文件加载时间仍然是snailspeed。

第三个想法是两个项目之间的 compojure 版本差异,但即使将第二个项目升级到最新版本,或将第一个项目降级到以前的版本,问题仍然存在。

在监控时,我还注意到 java 进程在页面访问时跳转到 350% CPU。

我试图恢复我所做的所有更改,但无法找出问题所在。作为 clojure 和 clojurescript 的新手,我没有想法。我显然不能等待每个页面加载 15 秒,只是为了在控制台中看到一条消息。

/编辑:

项目.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-bodywrap-json-response,尽管我已经尝试禁用两者。

【问题讨论】:

  • 这不是很多信息。你能粘贴你的project.clj吗?或者,您正在使用什么版本的 Ring/Compojure/Clojure/Java,您正在应用哪些中间件,正在为您的应用程序提供服务的 HTTP 服务器等等......您粘贴的 sn-ps 看起来不错,问题基本上可能出在管道中的任何位置。 :)
  • @xsc 粘贴了整个 project.clj 文件。由于该项目仍处于早期开发阶段,因此我通过默认的无头环服务器为所有内容提供服务。中间件是 wrap-json-bodywrap-json-response,但删除两者都没有帮助。另外,第二个项目也同时使用了这两个项目,没有任何问题。有什么想法吗?
  • 抱歉,不知道。我看到您正在加载 129 个文件,这可能会给服务器带来一些压力(尽管它不应该)。即,如果每个文件的加载时间为 100 毫秒,并且服务器按顺序为它们提供服务,那么您最终可能会到达现在的位置。但这充其量只是一个未经证实的猜测。
  • 找到了问题的根源。看我的回答

标签: clojure leiningen clojurescript ring compojure


【解决方案1】:

我找到了造成这种巨大性能损失的罪魁祸首。经过大量调试后,我发现项目 1 和项目 2 之间的唯一区别是资源文件夹。

项目 1 包括整个前端项目。很多文件通过bower,scss,编译css,编译cljs等等。良好的前端开发所需的一切。总共 10506 个文件。

项目 2 是一个测试项目,包括一些 HTML、javascript 和编译的 cljs 文件。 142 个文件。

为了测试,我将一些文件移出资源文件夹和 ta-daa,文件加载降至几毫秒。将文件移回资源文件夹,性能得到提升。

我将在 compojure 项目中提交错误报告。可能是他们还没有意识到的事情。

【讨论】:

  • 那不是真正的错误,是吗?如果您要提供大量数据,则必须等待数据到达。
  • 我没有同时访问这些文件,所以老实说,我不认为文件系统中存在文件会导致如此大的性能下降。反正提交给compojure的issue后,原来是和java的class path中的文件数量有关
  • 我明白了。有趣的是,资源查找时间会受到可用文件数量的影响。如果必须检查很多 JAR 的索引,我预计它会恶化,但在这种情况下不会。会记住的,感谢您对此的跟进。 :)
猜你喜欢
  • 2012-02-09
  • 2018-12-17
  • 1970-01-01
  • 1970-01-01
  • 2015-10-15
  • 1970-01-01
  • 2013-01-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多