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. 
>
>

Reply via email to