From 641540777ff6e49672aeafb4128f160fc8e05861 Mon Sep 17 00:00:00 2001 From: Chris Nuernberger Date: Sat, 3 Feb 2024 11:20:58 -0700 Subject: [PATCH] Reducing the cost of including datatype.clj --- src/tech/v3/datatype.clj | 13 ++++------ src/tech/v3/datatype/export_symbols.clj | 15 ++++++++--- src/tech/v3/datatype/unary_op.clj | 1 - src/tech/v3/datatype_api.clj | 34 ++++++------------------- 4 files changed, 25 insertions(+), 38 deletions(-) diff --git a/src/tech/v3/datatype.clj b/src/tech/v3/datatype.clj index c6a388d8..dd0a6351 100644 --- a/src/tech/v3/datatype.clj +++ b/src/tech/v3/datatype.clj @@ -394,6 +394,11 @@ (tech.v3.datatype-api/ensure-serializeable item))) +(defmacro export-symbols + ([lib & args] + `(tech.v3.datatype-api/export-symbols ~lib ~@args))) + + (defn get-datatype "Legacy method, returns elemwise-datatype" ([item] @@ -512,14 +517,6 @@ user> (dtype/make-reader :float32 5 (* idx 2)) (tech.v3.datatype.native-buffer/malloc n-bytes))) -(defn map-factory - "Create an IFn taking exactly n-keys arguments to rapidly create a map. - This moves the key-checking to the factory creation and simply creates a - new map as fast as possible when requrested" - ([key-seq] - (tech.v3.datatype-api/map-factory key-seq))) - - (defn prealloc-list "Make an list with preallocated storage. This function exists to cause a compilation error if older versions of dtype-next are included and is diff --git a/src/tech/v3/datatype/export_symbols.clj b/src/tech/v3/datatype/export_symbols.clj index 8f2115b4..ebf2ae2b 100644 --- a/src/tech/v3/datatype/export_symbols.clj +++ b/src/tech/v3/datatype/export_symbols.clj @@ -1,13 +1,15 @@ (ns tech.v3.datatype.export-symbols (:require [clojure.java.io :as io] [clojure.tools.logging :as log]) - (:import [java.io Writer])) + (:import [java.io Writer] + [java.util.concurrent.locks ReentrantLock])) + +(def ^ReentrantLock load-lib-lock (ReentrantLock.)) (defmacro export-symbols [src-ns & symbol-list] `(do - (#'clojure.core/load-lib nil '~src-ns) ~@(->> symbol-list (mapv (fn [sym-name] @@ -39,7 +41,14 @@ (format "Cannot export macros as this breaks aot: %s" sym-name) {:symbol sym-name}))) - `(def ~(with-meta sym-name full-meta) ~(symbol (name src-ns) (name sym-name))))))))) + `(def ~(with-meta sym-name full-meta) + (do + (.lock load-lib-lock) + (try + (#'clojure.core/load-lib nil '~src-ns) + (finally + (.unlock load-lib-lock))) + ~(symbol (name src-ns) (name sym-name)))))))))) (defn- write! ^Writer [^Writer writer data & datas] diff --git a/src/tech/v3/datatype/unary_op.clj b/src/tech/v3/datatype/unary_op.clj index c00572ed..42fe9988 100644 --- a/src/tech/v3/datatype/unary_op.clj +++ b/src/tech/v3/datatype/unary_op.clj @@ -379,7 +379,6 @@ (def builtin-ops (->> [(make-double-unary-op :tech.numerics/floor (Math/floor x)) (make-double-unary-op :tech.numerics/ceil (Math/ceil x)) - (make-double-unary-op :tech.numerics/round (unchecked-double (Math/round (double x)))) (make-double-unary-op :tech.numerics/rint (Math/rint x)) (make-double-unary-op :tech.numerics/get-significand (unchecked-double (get-significand x))) (make-numeric-object-unary-op :tech.numerics/- (- x)) diff --git a/src/tech/v3/datatype_api.clj b/src/tech/v3/datatype_api.clj index 73f2bc7c..6255e40a 100644 --- a/src/tech/v3/datatype_api.clj +++ b/src/tech/v3/datatype_api.clj @@ -2,30 +2,17 @@ "Base namespace for container creation and elementwise access of data" (:require [tech.v3.datatype.dispatch :as dispatch] [tech.v3.datatype.errors :as errors] - [tech.v3.datatype.array-buffer :as abuf] - [tech.v3.datatype.native-buffer :as nbuf] - [tech.v3.datatype.list] [tech.v3.datatype.casting :as casting] [tech.v3.datatype.protocols :as dtype-proto] + [tech.v3.datatype.export-symbols] [tech.v3.datatype.clj-range] - [tech.v3.datatype.functional] - [tech.v3.datatype.copy-raw-to-item] [tech.v3.datatype.primitive] + [tech.v3.datatype.copy-raw-to-item] [tech.v3.datatype.monotonic-range :as dt-range] ;;import in clone for jvm maps - [tech.v3.datatype.export-symbols :refer [export-symbols] :as export-symbols] ;;Includes to let clj-kondo know to parse this file after parsing these ;;namespaces - [tech.v3.datatype.base] - [tech.v3.datatype.argtypes] - [tech.v3.datatype.emap] - [tech.v3.datatype.argops] - [tech.v3.datatype.io-indexed-buffer] - [tech.v3.datatype.const-reader] - [tech.v3.datatype.io-concat-buffer] - [tech.v3.datatype.list :as dt-list] - [tech.v3.datatype.copy-make-container] - [tech.v3.datatype.fastobjs :as fastobjs]) + [tech.v3.datatype.list :as dt-list]) (:import [tech.v3.datatype BooleanReader LongReader DoubleReader ObjectReader Buffer ArrayBufferData NativeBufferData] [tech.v3.datatype.native_buffer NativeBuffer] @@ -35,6 +22,11 @@ [org.roaringbitmap RoaringBitmap]) (:refer-clojure :exclude [cast reverse])) +(defmacro export-symbols + [lib & symbols] + (require '[tech.v3.datatype.export-symbols]) + `(tech.v3.datatype.export-symbols/export-symbols ~lib ~@symbols)) + (export-symbols tech.v3.datatype.casting cast @@ -423,16 +415,6 @@ user> (dt/make-list :float32 (range 10)) (errors/throwf "Unable create create tensor for nd object type: %s" (type item)))))) - -(defn map-factory - "Create an IFn taking exactly n-keys arguments to rapidly create a map. - This moves the key-checking to the factory creation and simply creates a - new map as fast as possible when requrested" - [key-seq] - (if (empty? key-seq) - (constantly {}) - (fastobjs/map-factory key-seq))) - (comment (export-symbols/write-api! 'tech.v3.datatype-api