Jake, code_warntype( function, (argtype, ..) ) is helpful, and so is the Benchmarks package https://github.com/johnmyleswhite/Benchmarks.jl
for Unitful, julia> code_warntype(+,(typeof(1m),typeof(1m))) Variables: #self#::Base.#+ x::Unitful.RealQuantity{Int64,Unitful.UnitData{(m,)}} y::Unitful.RealQuantity{Int64,Unitful.UnitData{(m,)}} Body: begin # /home/jas/.julia/v0.5/Unitful/src/Unitful.jl, line 321: return $(Expr(:new, Unitful.RealQuantity{Int64,Unitful.UnitData{(m,)}}, :((Base.box)(Int64,(Base.add_int)((top(getfield))(x::Unitful.RealQuantity{Int64,Unitful.UnitData{(m,)}},:val)::Int64,(top(getfield))(y::Unitful.RealQuantity{Int64,Unitful.UnitData{(m,)}},:val)::Int64))))) end::Unitful.RealQuantity{Int64,Unitful.UnitData{(m,)}} and @benchmark 1m+1cm shows 0 bytes were allocated for your code julia> code_warntype(+,(typeof(1m),typeof(1m))) Variables: a::Meter{1,0} b::Meter{1,0} mag::Int64 aval::Any bval::Any #s4::Int64 Body: begin # none, line 4: GenSym(0) = (Main.normalize)(a::Meter{1,0},b::Meter{1,0}):: Tuple{Int64,Any,Any} #s4 = 1 GenSym(4) = (Base.getfield)(GenSym(0),1)::Any GenSym(5) = (Base.box)(Base.Int,(Base.add_int)(1,1)) mag = GenSym(4) #s4 = GenSym(5) GenSym(6) = (Base.getfield)(GenSym(0),2)::Any GenSym(7) = (Base.box)(Base.Int,(Base.add_int)(2,1)) aval = GenSym(6) #s4 = GenSym(7) GenSym(8) = (Base.getfield)(GenSym(0),3)::Any GenSym(9) = (Base.box)(Base.Int,(Base.add_int)(3,1)) bval = GenSym(8) #s4 = GenSym(9) # none, line 5: return call((top(apply_type))(Main.Meter,1,mag::Int64):: Type{_<:Meter{1,magnitude}},aval + bval::Any)::Meter{d,magnitude} end::Meter{d,magnitude} and @benchmark 1m+1m show 48 bytes allocated Anything code_warntype highlights indicates type ambiguity or lack of type specialization; that derails multidispatched specialization, and so costs time. And code that does not allocate memory is, in a sense, doing more with less -- or doing more earlier, so it does less at runtime. On Friday, February 19, 2016 at 3:13:10 AM UTC-5, Tamas Papp wrote: > > Exchange rates are prices, and thus are (1) dynamic (and can be very > volatile even in the short run) and (2) dispersed: you observe multiple > exchange rates depending on quantity, location, assets exchanged > (banknotes or other claims). > > It is very difficult to make a "general" library for exchange rates, not > because of the coding, but because of conceptual issues. Specific > applications (eg accounting with a given source of "official" exchange > rates, or a trader in a specific market) allow you to make further > assumptions and simplify. > > In particular, I don't see how exchange rates fit with SI units at all. > > Best, > > Tamas > > On Thu, Feb 18 2016, Jeffrey Sarnoff wrote: > > > I am thinking about how Currencies would fit with software for handling > SI > > and other physical dimensions and the usual units of measure. > > The following approach seems workable and (mostly) not disruptive to the > > working and evolving code Andrew Keller offers the community. > > > > A currency behaves as a representation of, or a stand-in or proxy for > all > > the banknotes, sovereign wealth and other property interests of a > nation. > > Two or more currencies for which there is a market that allows one to be > > converted into another at an agreed upon, current rate of exchange are > not > > that different from two or more units of length or units of time that > are > > allowed to be converted into one another using a predefined > multiplicative > > ratio. > > > > (now, 1.0 US Dollar = 8.45536 Swedish Krona, refreshing the page, > now > > 1.0 US Dollar = 8.45518 Swedish Krona) > > > > The most impactful distinction is that rates of exchange are dynamic > while > > the physical conversion factors (BIPM standards, CODATA values) persist. > > However currencies may be accommodated, it must protect our ability work > > with units with ease and with invisibly amortized processing overhead. > > So, the request that gets the appropriate exchange rate to use when > > converting from one currency to another must come from the Units code in > a > > way that does not require other physical unit conversions to operate any > > differently. > > > > One of the things on Andrew's future to do list is allow measures and > their > > uncertainties to be used and to interact respecting the uncertainty > math. > > In any currency exchange trade, there is a buyer and a seller. Usually, > > when they (or their requests) meet, they disagree. The buyer wants to > pay > > as little as possible and the seller wants to receive as much as > possible. > > That separation is called the bid-ask spread (the buyer bids, the seller > > asks); almost always it is very, very small relative to the total value > > being exchanged. The uncertainties associated with physical measures > and > > conversions usually are very, very small relative to the total quantity > > being determined or the value being mapped into different units. When > > uncertainty management is introduced, it is conceivable that currency > > support could take advantage of that analogous role. > >