2017-10-10 14 views
0

다음 작업을 수행합니다.
생성 할 데이터의 수인 하나의 매개 변수를 취하는 콘솔 응용 프로그램을 만들어야합니다. 데이터는 사람 주소와 이름입니다. state, city, zip-code 필드가있는 adress 테이블을 만듭니다. 또한 firstlast name 열이있는 테이블을 만듭니다. 나는 PostgreSQL을 다루기 위해 HugSQL을 사용합니다. 따라서 동적으로 주소와 이름을 섞어서 결과를 콘솔에 출력하려고합니다. 생성 된 값의 수는 응용 프로그램에 전달 된 인수에 따라 다릅니다. 이것은 내 코드입니다.db에서 데이터 가져 오기, 변환 및 콘솔로 인쇄

(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 분 안에 1 백만 값이라는 제한이 있습니다. 어떻게 평가의 속도를 높이려면? 기능 (get/usa)adress 표에서 모든 데이터를 검색합니다.

+0

'usa-address-getter'가 이상하게 보입니다. 그것은 제대로 작동합니까? 'project.db/get'을 사용하여'clojure.core/get'을 그릴 수 있기 때문에 실제로는 안됩니다. 코드 – leetwinski

+0

또한'(into {} (shuffle usa-data))'의심스러운 것으로 보입니다. 왜냐하면 usa-data는 일련의 레코드를 반환해야하기 때문에 맵에 추가하는 것이 무의미한 것처럼 보입니다. 어쩌면 그것은'({{}으로 (처음으로 (usa-data를 뒤섞다))')'? 아무리해도 낮은 성능의 핵심은 seebs : 모든 반복 작업에서 열심히 백만 개의 항목을 섞어서 ** 정말 느립니다 (내 컴퓨터에서 약 250ms). '(rand-nth usa-data)에''rand-nth' :' – leetwinski

+0

'과 같이 기록을 인쇄해야하는 것이 아니라면 전체를 구성하는 것이 더 나을 수도 있습니다. (반복적으로 (파싱 값이) usa-address-getter))'와 같이'repeater'함수를 던져 버리십시오. – leetwinski

답변

0

이 성능 병목이 코드의이 작품에서 말 어렵지만, 여기에 몇 가지 도움말입니다 : 핫스팟

  • 사용 유형 힌트를. 때때로 Clojure 컴파일러는 형식을 알아낼 수 없으며 형식 힌트를 사용하면 작업 속도가 빨라질 수 있습니다. 이 경우 usa-address-getter fn : (defn ^String usa-adress-getter [] ...)
  • 과 같이 설정할 수 있습니다. concat과 같은 SQL 함수를 사용하여 데이터베이스에서 연결된 문자열을 반환하도록 쿼리를 수정하는 것이 좋습니다. 그렇게하면 해시 값을 가져 오지 않고 문자열을 직접 작성할 필요가 없습니다.
  • 인쇄 작업이 느려질 수 있으므로 @leetwinsky가 말한 것처럼 제거 할 수 있습니다.
  • 코드의 성능을 자세히 측정해야합니다. 그렇지 않으면 수정으로 인해 속도가 향상되었는지 알 수 없습니다. 예를 들어, 1000 개의 레코드가 처리 될 때마다 msec 수를 인쇄하는 타이머를 넣을 수 있습니다. 물론 한 번에 하나의 변경 만 수행하십시오.

희망이 도움이됩니다.