0

我有以下任务。
我需要创建一个控制台应用程序,它需要一个参数,即要生成的数据数量。数据是人员地址和姓名。我创建了一个adress带有state, city, zip-code字段的表。我还创建了一个包含firstlast name列的表。我使用 HugSQL 来处理 PostgreSQL。所以我想动态混合地址、名字和姓氏并将结果打印到控制台中,生成的值的数量取决于传递给应用程序的参数。这是我的代码:

(ns project.core
  (:require
    [project.db.get :as get]))

(defn parse-int [s]
  (Integer. (re-find  #"\d+" s )))

(def usa-data (get/usa))

(defn usa-adress-getter []
  (let [data (into {} (shuffle  usa-data))
        city (get data :city)
        state (get data :state)
        zip (get data :zip_code)]
    (str state " " city " " zip)))

(defn repeater [times]
  (dotimes [i times]
    (println (usa-adress-getter))))

(defn -main [value]
  (repeater (parse-int value)))

这里我只是检查usa-adress-getter函数的结果。但是函数评估的时间太大了,我的限制是 1 分钟内有 100 万个值。如何提高评价速度?函数从表中(get/usa)检索所有数据。adress

4

1 回答 1

1

从这段代码中很难说性能瓶颈在哪里,但这里有一些提示:

  • 对热点使用类型提示。有时 Clojure 编译器无法确定类型,然后类型提示可以大大加快速度。在这种情况下,您可以在usa-address-getterfn 上设置它:(defn ^String usa-adress-getter [] ...)
  • 您可以考虑修改您的查询,以便它从数据库返回连接的字符串(使用 SQL 函数,如concat)。这样,您就不需要从哈希中获取值并自己构建字符串。
  • 打印的东西可能很慢,所以你可以消除它,就像@leetwinsky 说的那样。
  • 您必须详细测量代码的性能,否则您将无法判断修改是否为您带来了一些速度。例如,您可以放置​​一个计时器,打印每处理 1000 条记录的毫秒数。当然,一次只能进行一次更改。

希望这可以帮助。

于 2017-10-11T09:44:31.667 回答