Clojureの最近のブログ記事

先日書いた Codeeval で Clojure が遅い&メモリを大量に消費する件、 サポート掲示板に記事がありました。

https://getsatisfaction.com/codeeval/topics/clojuretimememorystatsseem_wrong

Official Representative の人が

It's true that Clojure takes too much resources. At least on our environment. We'll be investigating this soon.

と言っているので、そのうち対応されるのではないか、と。
4ヶ月前のものなので、時間かかり過ぎな気がしなくもないですが・・・。

Clojure をもう少し書けるようになりたいな、と思って Ruby で書いていた CodeEval の課題の幾つかを Clojure で書きなおしてみたんだけど、実行速度が Ruby と比較するととても遅い。。。

例えば Open ChallengesLowercase だと、

  • Ruby : 187 ms
  • Clojure : 5052 ms

27倍くらい時間が掛かっているし、メモリ量も

  • Ruby 3.4MB
  • Clojure 58.1MB

と17倍くらいの開きが。。。
別にランキング入りを狙っているわけではないので、アホみたいに高速で動くコードを書きたいというわけではないですが、初学者として「俺の書いているコード、これじゃ全然ダメなんじゃないか?」と、かなり不安に思っています。

スクリーンショットも貼っておきます。

Screen Shot 2013-11-22 at 10.24.44 AM.png

Ruby 版のコードはこんな感じ。

file = open(ARGV[0])
file.each {|line| print line.downcase! }
file.close

Clojure 版はこんな感じ。

(println (.toLowerCase (slurp (first *command-line-args*))))

「CodeEval で実行するの場合、こう書いた方が早いよ!」というのをご存知の方がいらっしゃいましたら、是非教えて下さい。よろしくお願いします。

おいしいClojure入門 (Software Design plus)
ニコラ・モドリック 安部 重成
技術評論社
売り上げランキング: 57,899

プログラミングClojure 第2版
Stuart Halloway and Aaron Bedra
オーム社
売り上げランキング: 134,200

プログラミング言語 Ruby
まつもと ゆきひろ David Flanagan
オライリージャパン
売り上げランキング: 197,492

さっきのエントリ の続き。

チュートリアルのページにある templates/header.html をプロジェクトの src 以下に配置しました。コミットはこれ

分からなくてハマった(ハマってる)のが

  • templates ディレクトリの作成場所
    • 最初、 src と同じ階層においてしまった
    • src の中に置く、で良いのだろうか
  • チュートリアルでは次にコードが続いているけど、それは src/core.clj に書いていいんだろうか?

lein repl で作成したテンプレートを読み込みしてみると、ここまでは上手く行っているように見える。

enlive-templating ➤ lein repl
nREPL server started on port 49735
REPL-y 0.1.10
Clojure 1.5.1
    Exit: Control+D or (exit) or (quit)
Commands: (user/help)
    Docs: (doc function-name-here)
          (find-doc "part-of-name-here")
  Source: (source function-name-here)
          (user/sourcery function-name-here)
 Javadoc: (javadoc java-object-or-class-here)
Examples from clojuredocs.org: [clojuredocs or cdoc]
          (user/clojuredocs name-here)
          (user/clojuredocs "ns-here" "name-here")
user=> (ns enlive-templating
  #_=>   (:require [net.cgrand.enlive-html :as html]))
nil
enlive-templating=> (use 'clojure.pprint)
nil
enlive-templating=> (pprint (html/html-resource "templates/header.html"))
({:type :dtd, :data ["html" nil nil]}
 {:tag :html,
  :attrs {:lang "ja"},
  :content
  ("\n  "
   {:tag :body,
    :attrs nil,
    :content
    ("\n\t"
     {:tag :header, 
      :attrs nil,   
      :content
      ("\n\t  "
       {:tag :h1, :attrs nil, :content ("Header placeholder")}
       "\n\t  "
       {:tag :ul,   
        :attrs {:id "navigation"},
        :content
        ("\n\t\t"   
         {:tag :li, 
          :attrs nil,
          :content  
          ({:tag :a,
            :attrs {:href "#"},
            :content ("Placeholder for navigation")})}
         "\n\t  ")} 
       "\n\t")}
     "\n  ")}
   "\n\n")})
nil

Github にある clojure-cookbook にあるチュートリアルから着手することにしました。

https://github.com/clojure-cookbook/clojure-cookbook/blob/master/webapps/templating-with-enlive/templating-with-enlive.asciidoc

enlive を :dependencies に追加して lein deps を実行。 lein repl が動くようになった。

enlive-templating ➤ lein deps
Retrieving enlive/enlive/1.1.1/enlive-1.1.1.jar from clojars
enlive-templating ➤ lein repl
Retrieving cheshire/cheshire/4.0.3/cheshire-4.0.3.jar from clojars
Retrieving clojure-complete/clojure-complete/0.2.2/clojure-complete-0.2.2.jar from clojars
Retrieving slingshot/slingshot/0.10.3/slingshot-0.10.3.jar from clojars
Retrieving clj-http-lite/clj-http-lite/0.2.0/clj-http-lite-0.2.0.jar from clojars
Retrieving org/thnetos/cd-client/0.3.6/cd-client-0.3.6.jar from clojars
nREPL server started on port 65351
REPL-y 0.1.10
Clojure 1.5.1
    Exit: Control+D or (exit) or (quit)
Commands: (user/help)
    Docs: (doc function-name-here)
          (find-doc "part-of-name-here")
  Source: (source function-name-here)
          (user/sourcery function-name-here)
 Javadoc: (javadoc java-object-or-class-here)
Examples from clojuredocs.org: [clojuredocs or cdoc]
          (user/clojuredocs name-here)
          (user/clojuredocs "ns-here" "name-here")
user=> exit
Bye for now!

コミットはこれ

Leiningen のインストール

Github の leiningen プロジェクトにある README の通りに作業。~/bin にインストールが推奨っぽいので、それに従う。

bin ➤ vi ./lein
bin ➤ chmod 755 ./lein
bin ➤ ./lein self-install                                                                                              
Manual self-install is deprecated; it will run automatically when necessary.
Downloading Leiningen to /Users/yz/.lein/self-installs/leiningen-2.3.3-standalone.jar now...
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 13.0M  100 13.0M    0     0   137k      0  0:01:37  0:01:37 --:--:-- 1267k

このアーカイブについて

このページには、過去に書かれた記事のうちClojureカテゴリに属しているものが含まれています。

前のカテゴリはcarです。

次のカテゴリはcomputers and technologiesです。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

月別 アーカイブ

ウェブページ

OpenID対応しています OpenIDについて
Powered by Movable Type 6.1.2