Search code examples
optimizationd

Get float value out of JSONValue in dlang


I am parsing JSON to present a report. While parsing the field rating it can have either 3 which parses to JSONValue.integer or 3.4 which parses to JSONValue.floating and I need to convert them as float in the report. I have profiled the code to look for optimisation and the get_number function that converts the given input to floating point is taking a lot of time and also uses exceptions for the code.

I can use fast.d (https://github.com/mleise/fast) but I am trying to see if there are anymore optimisations that can be done on get_number function that is taking up time . Is there a way to get the floating point value without using the exceptions and are there any more optimisations that can be done?

redbus.d

import std.net.curl;
import std.exception;
import std.json;
import std.stdio;
import std.file;
import std.algorithm;
import std.array;
import std.conv;
import std.string;

auto fmt = "%35s | %10s | %10s | %10s | %15s";
auto value_fmt = "%35s | %10.2f | %10.0f | %10.2f | %15s";

void print_header() {
  writeln("-----------------------------------------------------------------------------------------------");
  writefln(fmt, "Name", "Price", "Window", "Rating", "Type");
  writeln("-----------------------------------------------------------------------------------------------");
}

float get_number(T)(T item) {
  float output = 0;
  try {
    output = to!float(item.integer);
  } catch(Exception e) {
    output = to!float(item.floating);
  }
  return to!float(output);
}

void print_item(T)(T item) {
  writefln(value_fmt, item["Tvs"].str, item["MinFare"].get_number(), item["WnSt"].get_number(), item["Rtg"]["totRt"].get_number(), item["BusCategory"]["IsSleeper"]);
}

void main() {
  auto content = readText("sample.json");
  auto parsed = parseJSON(content);
  auto raw = parsed["SRD"][0]["RIN"][0]["InvList"].array;
  auto filtered = raw.filter!(item => to!bool(to!string(item["BusCategory"]["IsAc"])));

  print_header();
  foreach(item; filtered) {
    print_item(item);
  }
}

App specific trace log when ran with dmd -g -run redbus.d | grep redbus

======== Timer Is 3579545 Ticks/Sec, Times are in Microsecs ========

  Num          Tree        Func        Per
  Calls        Time        Time        Call

180     8673696     8300660       46114     @safe immutable(char)[] redbus.get_number!(std.json.JSONValue).get_number(std.json.JSONValue)
 60     9448603       75423        1257     @safe void redbus.print_item!(std.json.JSONValue).print_item(std.json.JSONValue)
 60       17581       10002         166     pure @safe void std.algorithm.iteration.__T12FilterResultS246redbus4mainFZ9__lambda1TAS3std4json9JSONValueZ.FilterResult.popFront()
  2      110576        6987        3493     void redbus.print_header()
122        5635        5441          44     pure nothrow @property @nogc @safe bool std.algorithm.iteration.__T12FilterResultS246redbus4mainFZ9__lambda1TAS3std4json9JSONValueZ.FilterResult.empty()
 60        4002        2877          47     pure nothrow ref @property @nogc @safe std.json.JSONValue std.algorithm.iteration.__T12FilterResultS246redbus4mainFZ9__lambda1TAS3std4json9JSONValueZ.FilterResult.front()
 60         690         690          11     pure @safe bool redbus.main().__lambda1!(std.json.JSONValue).__lambda1(std.json.JSONValue)
  2         386         348         174     pure ref @safe std.algorithm.iteration.__T12FilterResultS246redbus4mainFZ9__lambda1TAS3std4json9JSONValueZ.FilterResult std.algorithm.iteration.__T12FilterResultS246redbus4mainFZ9__lambda1TAS3std4json9JSONValueZ.FilterResult.__ctor(std.json.JSONValue[])
  2         480          94          47     pure @safe std.algorithm.iteration.__T12FilterResultS246redbus4mainFZ9__lambda1TAS3std4json9JSONValueZ.FilterResult std.algorithm.iteration.__T6filterS246redbus4mainFZ9__lambda1Z.filter!(std.json.JSONValue[]).filter(std.json.JSONValue[])
  2          28          28          14     pure nothrow @nogc @safe std.algorithm.iteration.__T12FilterResultS246redbus4mainFZ9__lambda1TAS3std4json9JSONValueZ.FilterResult std.algorithm.iteration.__T12FilterResultS246redbus4mainFZ9__lambda1TAS3std4json9JSONValueZ.FilterResult.opSlice()

Full trace log when ran with dmd -g -run redbus.d

======== Timer Is 3579545 Ticks/Sec, Times are in Microsecs ========

  Num          Tree        Func        Per
  Calls        Time        Time        Call

    180     8673696     8300660       46114     @safe immutable(char)[] redbus.get_number!(std.json.JSONValue).get_number(std.json.JSONValue)
 378142     7487455     5101529          13     pure @safe dchar std.json.parseJSON!(immutable(char)[]).parseJSON(immutable(char)[], int, std.json.JSONOptions).popChar()
 403760    11591911     4118861          10     pure @safe dchar std.json.parseJSON!(immutable(char)[]).parseJSON(immutable(char)[], int, std.json.JSONOptions).peekChar()
  13218    11298746     3847457         291     @safe immutable(char)[] std.json.parseJSON!(immutable(char)[]).parseJSON(immutable(char)[], int, std.json.JSONOptions).parseString()
      2     3416630     3410981     1705490     @safe void[] std.file.read!(immutable(char)[]).read(immutable(char)[], ulong)
  11694    26577653     2975245         254     @safe void std.json.parseJSON!(immutable(char)[]).parseJSON(immutable(char)[], int, std.json.JSONOptions).parseValue(ref std.json.JSONValue)
      2     3189533     2760109     1380054     pure @safe void std.utf.validate!(immutable(char)[]).validate(const(immutable(char)[]))
  50558     9391716     2176452          43     pure @safe void std.json.parseJSON!(immutable(char)[]).parseJSON(immutable(char)[], int, std.json.JSONOptions).skipWhitespace()
 378142     2199763     1819030           4     pure @property @safe dchar std.range.primitives.front!(immutable(char)).front(immutable(char)[])
 120448     4223189     1521014          12     pure @safe void std.array.Appender!(immutable(char)[]).Appender.put!(dchar).put(dchar)
 121018     1447202     1447202          11     _D3std5array17__T8AppenderTAyaZ8Appender11__T3putTAaZ3putMFAaZ10bigDataFunMFNaNbNemZAa
 121018     2663475     1216273          10     pure nothrow @safe void std.array.Appender!(immutable(char)[]).Appender.put!(char[]).put(char[])
 378144      429423      429423           1     pure @trusted dchar std.utf.decode!(0, const(immutable(char)[])).decode(ref const(immutable(char)[]), ref ulong)
 378142      380732      380732           1     pure @trusted dchar std.utf.decode!(0, immutable(char)[]).decode(ref immutable(char)[], ref ulong)
   3844     1585268      379140          98     _D3std4json18__T9parseJSONTAyaZ9parseJSONFAyaiE3std4json11JSONOptionsZ10parseValueMFKS3std4json9JSONValueZ11readIntegerMFNaNfZv
  17692     3044067      299545          16     pure @safe bool std.json.parseJSON!(immutable(char)[]).parseJSON(immutable(char)[], int, std.json.JSONOptions).testChar!(true, true).testChar(char)
   3694      302920      283609          76     pure @safe ulong std.conv.parse!(ulong, immutable(char)[]).parse(ref immutable(char)[])
  21172     5305573      253537          11     pure @safe void std.json.parseJSON!(immutable(char)[]).parseJSON(immutable(char)[], int, std.json.JSONOptions).checkChar!(true, true).checkChar(char)
   2858      241132      241132          84     _D3std5stdio4File17LockingTextWriter10__T3putTaZ3putMFNfaZ12trustedFPUTCFNbNiNeiPS4core4stdc5stdio7__sFILEZi
 749606      194721      194721           0     pure nothrow @property @nogc @safe bool std.range.primitives.empty!(char).empty(const(char[]))
    180      146178      146178         812     nothrow @nogc @trusted int std.format.formatValue!(std.array.Appender!(immutable(char)[]).Appender, float, char).formatValue(std.array.Appender!(immutable(char)[]).Appender, float, ref std.format.FormatSpec!(char).FormatSpec).__lambda6()
 168966      289542      140496           0     pure @safe dchar std.json.parseJSON!(immutable(char)[]).parseJSON(immutable(char)[], int, std.json.JSONOptions).getChar!(false).getChar()
    372      175283      138897         373     @safe bool std.format.FormatSpec!(char).FormatSpec.writeUpToNextSpec!(std.stdio.File.LockingTextWriter).writeUpToNextSpec(std.stdio.File.LockingTextWriter)
 378142      127665      127665           0     pure nothrow @nogc @trusted void std.range.primitives.popFront!(immutable(char)).popFront(ref immutable(char)[])
 120838       88309       88309           0     pure @safe ulong std.utf.encode!(0).encode(ref char[4], dchar)
   7004      269543       79286          11     pure @safe void std.json.parseJSON!(immutable(char)[]).parseJSON(immutable(char)[], int, std.json.JSONOptions).checkChar!(false, false).checkChar(char)
     60     9448603       75423        1257     @safe void redbus.print_item!(std.json.JSONValue).print_item(std.json.JSONValue)
    180      357433       73536         408     @safe immutable(char)[] std.conv.toStr!(immutable(char)[], float).toStr(float)
  11694     1701071       65993           5     pure @safe dchar std.json.parseJSON!(immutable(char)[]).parseJSON(immutable(char)[], int, std.json.JSONOptions).getChar!(true).getChar()
     62      546598       58901         950     @safe uint std.format.formattedWrite!(std.stdio.File.LockingTextWriter, char, immutable(char)[], immutable(char)[], immutable(char)[], immutable(char)[], immutable(char)[]).formattedWrite(std.stdio.File.LockingTextWriter, const(char[]), immutable(char)[], immutable(char)[], immutable(char)[], immutable(char)[], immutable(char)[])
    624       57414       57414          92     nothrow @nogc @trusted ulong std.stdio.trustedFwrite!(char).trustedFwrite(shared(core.stdc.stdio.__sFILE)*, const(char[]))
    310      287767       55386         178     @safe void std.format.formatRange!(std.stdio.File.LockingTextWriter, immutable(char)[], char).formatRange(ref std.stdio.File.LockingTextWriter, ref immutable(char)[], ref std.format.FormatSpec!(char).FormatSpec)
    180      283897       51186         284     @safe void std.format.formatValue!(std.array.Appender!(immutable(char)[]).Appender, float, char).formatValue(std.array.Appender!(immutable(char)[]).Appender, float, ref std.format.FormatSpec!(char).FormatSpec)
   2792      188331       44715          16     @safe void std.range.primitives.put!(std.stdio.File.LockingTextWriter, char).put(ref std.stdio.File.LockingTextWriter, char)
   3786       51453       42260          11     pure @safe bool std.json.parseJSON!(immutable(char)[]).parseJSON(immutable(char)[], int, std.json.JSONOptions).testChar!(false, false).testChar(char)
      1    42812121       40946       40946     _Dmain
   2792      143615       40695          14     @safe void std.range.primitives.doPut!(std.stdio.File.LockingTextWriter, char).doPut(ref std.stdio.File.LockingTextWriter, ref char)
   2858      276528       35396          12     @safe void std.stdio.File.LockingTextWriter.put!(char).put(char)
     62      730778       28544         460     @safe void std.stdio.File.writefln!(char, immutable(char)[], immutable(char)[], immutable(char)[], immutable(char)[], immutable(char)[]).writefln(const(char[]), immutable(char)[], immutable(char)[], immutable(char)[], immutable(char)[], immutable(char)[])
     58       27284       25878         446     pure @safe double std.conv.parse!(double, immutable(char)[]).parse(ref immutable(char)[])
      4       61182       22565        5641     @safe void std.stdio.writeln!(immutable(char)[]).writeln(immutable(char)[])
    668       36701       22086          33     pure nothrow @safe void std.array.Appender!(immutable(char)[]).Appender.put!(char).put(char)
  10790       15562       15562           1     pure nothrow @nogc @safe dchar std.ascii.toLower!(dchar).toLower(dchar)
    180       14091       14091          78     pure nothrow @nogc @trusted immutable(char)[] std.algorithm.searching.find!("a == b", immutable(char)[], char).find(immutable(char)[], char).trustedMemchr(ref immutable(char)[], ref char)
    668       14165       12798          19     pure nothrow @nogc @safe void std.conv.emplaceRef!(char, char, char).emplaceRef(ref char, ref char)
    310      307336       11476          37     void std.format.formatGeneric!(std.stdio.File.LockingTextWriter, immutable(char)[], char).formatGeneric(std.stdio.File.LockingTextWriter, const(void)*, ref std.format.FormatSpec!(char).FormatSpec)
     62      741889       11111         179     @safe void std.stdio.writefln!(immutable(char)[], immutable(char)[], immutable(char)[], immutable(char)[], immutable(char)[], immutable(char)[]).writefln(immutable(char)[], immutable(char)[], immutable(char)[], immutable(char)[], immutable(char)[], immutable(char)[])
     60       17581       10002         166     pure @safe void std.algorithm.iteration.__T12FilterResultS246redbus4mainFZ9__lambda1TAS3std4json9JSONValueZ.FilterResult.popFront()
    314       51833        9902          31     @safe void std.stdio.File.LockingTextWriter.put!(immutable(char)[]).put(immutable(char)[])
    310       30175        9395          30     @safe void std.range.primitives.doPut!(std.stdio.File.LockingTextWriter, const(char)[]).doPut(ref std.stdio.File.LockingTextWriter, ref const(char)[])
    310       40073        8883          28     @safe void std.range.primitives.doPut!(std.stdio.File.LockingTextWriter, immutable(char)[]).doPut(ref std.stdio.File.LockingTextWriter, ref immutable(char)[])
    180       23372        8492          47     pure @safe immutable(char)[] std.algorithm.searching.find!("a == b", immutable(char)[], char).find(immutable(char)[], char)
    310      295860        8093          26     @safe void std.format.formatValue!(std.stdio.File.LockingTextWriter, immutable(char)[], char).formatValue(std.stdio.File.LockingTextWriter, immutable(char)[], ref std.format.FormatSpec!(char).FormatSpec)
  16860        7657        7657           0     pure nothrow @nogc @safe void std.range.primitives.popFront!(immutable(ubyte)).popFront(ref immutable(ubyte)[])
    180        9026        7524          41     pure nothrow @nogc @safe bool std.functional.safeOp!("<").safeOp!(immutable(int), ulong).safeOp(ref immutable(int), ref ulong)
      2      110576        6987        3493     void redbus.print_header()
  17034        6217        6217           0     pure nothrow ref @property @nogc @safe immutable(ubyte) std.range.primitives.front!(immutable(ubyte)).front(immutable(ubyte)[])
    120        5515        5515          45     pure nothrow ref @property @nogc @safe std.json.JSONValue std.range.primitives.front!(std.json.JSONValue).front(std.json.JSONValue[])
    122        5635        5441          44     pure nothrow @property @nogc @safe bool std.algorithm.iteration.__T12FilterResultS246redbus4mainFZ9__lambda1TAS3std4json9JSONValueZ.FilterResult.empty()
    310       20779        5296          17     @safe void std.stdio.File.LockingTextWriter.put!(const(char)[]).put(const(char)[])
    310       34821        4646          14     @safe void std.range.primitives.put!(std.stdio.File.LockingTextWriter, const(char)[]).put(ref std.stdio.File.LockingTextWriter, const(char)[])
    180       13549        4523          25     pure nothrow @nogc @safe immutable(int) std.algorithm.comparison.min!(immutable(int), ulong).min(immutable(int), ulong)
      2        5331        4353        2176     nothrow @nogc @safe std.internal.cstring.tempCString!(char, immutable(char)[]).tempCString(immutable(char)[]).Res std.internal.cstring.tempCString!(char, immutable(char)[]).tempCString(immutable(char)[])
    180      365563        4136          22     @safe immutable(char)[] std.conv.to!(immutable(char)[]).to!(float).to(float)
    130        4682        4089          31     pure nothrow @nogc @safe float std.conv.to!(float).to!(long).to(long)
    180      361427        3994          22     @safe immutable(char)[] std.conv.toImpl!(immutable(char)[], float).toImpl(float)
    310       44049        3975          12     @safe void std.range.primitives.put!(std.stdio.File.LockingTextWriter, immutable(char)[]).put(ref std.stdio.File.LockingTextWriter, immutable(char)[])
   3786        3530        3530           0     pure nothrow @nogc @safe immutable(char)[] std.string.assumeUTF!(immutable(ubyte)).assumeUTF(immutable(ubyte)[])
     34        3566        3268          96     pure @safe long std.conv.parse!(long, immutable(char)[]).parse(ref immutable(char)[])
     60        4002        2877          47     pure nothrow ref @property @nogc @safe std.json.JSONValue std.algorithm.iteration.__T12FilterResultS246redbus4mainFZ9__lambda1TAS3std4json9JSONValueZ.FilterResult.front()
   3786        2775        2775           0     pure nothrow @nogc @safe immutable(ubyte)[] std.string.representation!(immutable(char)).representation(immutable(char)[])
     50        2790        2342          46     pure nothrow @nogc @safe float std.conv.to!(float).to!(double).to(double)
    180        1501        1501           8     pure nothrow @nogc @safe bool std.functional.safeOp!("<").unsafeOp!(immutable(int), ulong).unsafeOp(immutable(int), ulong)
    184         940         940           5     pure nothrow @property @nogc @safe bool std.range.primitives.empty!(std.json.JSONValue).empty(const(std.json.JSONValue[]))
     60         919         919          15     pure nothrow @nogc @safe void std.range.primitives.popFront!(std.json.JSONValue).popFront(ref std.json.JSONValue[])
     58         833         833          14     pure nothrow @nogc @safe ubyte std.ascii.toUpper!(immutable(ubyte)).toUpper(immutable(ubyte))
      2     6607022         831         415     @safe immutable(char)[] std.file.readText!(immutable(char)[], immutable(char)[]).readText(immutable(char)[])
    180         787         787           4     pure nothrow @nogc @safe bool std.utf.canSearchInCodeUnits!(char).canSearchInCodeUnits(dchar)
     62         779         779          12     pure nothrow @nogc @trusted pure nothrow @safe void function(std.stdio.File.LockingTextWriter, const(void)*, ref std.format.FormatSpec!(char).FormatSpec)* std.format.formattedWrite!(std.stdio.File.LockingTextWriter, char, immutable(char)[], immutable(char)[], immutable(char)[], immutable(char)[], immutable(char)[]).formattedWrite(std.stdio.File.LockingTextWriter, const(char[]), immutable(char)[], immutable(char)[], immutable(char)[], immutable(char)[], immutable(char)[]).__lambda9()
     60         690         690          11     pure @safe bool redbus.main().__lambda1!(std.json.JSONValue).__lambda1(std.json.JSONValue)
     62         668         668          10     pure nothrow @nogc @trusted const(void*) std.format.formattedWrite!(std.stdio.File.LockingTextWriter, char, immutable(char)[], immutable(char)[], immutable(char)[], immutable(char)[], immutable(char)[]).formattedWrite(std.stdio.File.LockingTextWriter, const(char[]), immutable(char)[], immutable(char)[], immutable(char)[], immutable(char)[], immutable(char)[]).__lambda14!(immutable(char)[]).__lambda14(return ref immutable(char)[])
    130         593         593           4     pure nothrow @nogc @safe float std.conv.toImpl!(float, long).toImpl(long)
     62         574         574           9     pure nothrow @nogc @trusted const(void*) std.format.formattedWrite!(std.stdio.File.LockingTextWriter, char, immutable(char)[], immutable(char)[], immutable(char)[], immutable(char)[], immutable(char)[]).formattedWrite(std.stdio.File.LockingTextWriter, const(char[]), immutable(char)[], immutable(char)[], immutable(char)[], immutable(char)[], immutable(char)[]).__lambda16!(immutable(char)[]).__lambda16(return ref immutable(char)[])
    668         517         517           0     pure nothrow @nogc @trusted void std.conv.emplaceInitializer!(std.conv.emplaceRef!(char, char, char).emplaceRef(ref char, ref char).S).emplaceInitializer(ref std.conv.emplaceRef!(char, char, char).emplaceRef(ref char, ref char).S)
     62         494         494           7     pure nothrow @nogc @trusted pure nothrow @safe void function(std.stdio.File.LockingTextWriter, const(void)*, ref std.format.FormatSpec!(char).FormatSpec)* std.format.formattedWrite!(std.stdio.File.LockingTextWriter, char, immutable(char)[], immutable(char)[], immutable(char)[], immutable(char)[], immutable(char)[]).formattedWrite(std.stdio.File.LockingTextWriter, const(char[]), immutable(char)[], immutable(char)[], immutable(char)[], immutable(char)[], immutable(char)[]).__lambda15()
     62         494         494           7     pure nothrow @nogc @trusted pure nothrow @safe void function(std.stdio.File.LockingTextWriter, const(void)*, ref std.format.FormatSpec!(char).FormatSpec)* std.format.formattedWrite!(std.stdio.File.LockingTextWriter, char, immutable(char)[], immutable(char)[], immutable(char)[], immutable(char)[], immutable(char)[]).formattedWrite(std.stdio.File.LockingTextWriter, const(char[]), immutable(char)[], immutable(char)[], immutable(char)[], immutable(char)[], immutable(char)[]).__lambda17()
    668         479         479           0     pure nothrow @nogc @trusted std.conv.emplaceRef!(char, char, char).emplaceRef(ref char, ref char).S* std.conv.emplaceRef!(char, char, char).emplaceRef(ref char, ref char).__lambda5()
    668         449         449           0     _D3std5array17__T8AppenderTAyaZ8Appender10__T3putTaZ3putMFaZ9__lambda2MFNaNbNiNeZAa
     50         447         447           8     pure nothrow @nogc @safe float std.conv.toImpl!(float, double).toImpl(double)
      2    26578112         437         218     @safe std.json.JSONValue std.json.parseJSON!(immutable(char)[]).parseJSON(immutable(char)[], int, std.json.JSONOptions)
     62         423         423           6     pure nothrow @nogc @trusted const(void*) std.format.formattedWrite!(std.stdio.File.LockingTextWriter, char, immutable(char)[], immutable(char)[], immutable(char)[], immutable(char)[], immutable(char)[]).formattedWrite(std.stdio.File.LockingTextWriter, const(char[]), immutable(char)[], immutable(char)[], immutable(char)[], immutable(char)[], immutable(char)[]).__lambda18!(immutable(char)[]).__lambda18(return ref immutable(char)[])
     62         422         422           6     pure nothrow @nogc @trusted const(void*) std.format.formattedWrite!(std.stdio.File.LockingTextWriter, char, immutable(char)[], immutable(char)[], immutable(char)[], immutable(char)[], immutable(char)[]).formattedWrite(std.stdio.File.LockingTextWriter, const(char[]), immutable(char)[], immutable(char)[], immutable(char)[], immutable(char)[], immutable(char)[]).__lambda10!(immutable(char)[]).__lambda10(return ref immutable(char)[])
     62         416         416           6     pure nothrow @nogc @trusted pure nothrow @safe void function(std.stdio.File.LockingTextWriter, const(void)*, ref std.format.FormatSpec!(char).FormatSpec)* std.format.formattedWrite!(std.stdio.File.LockingTextWriter, char, immutable(char)[], immutable(char)[], immutable(char)[], immutable(char)[], immutable(char)[]).formattedWrite(std.stdio.File.LockingTextWriter, const(char[]), immutable(char)[], immutable(char)[], immutable(char)[], immutable(char)[], immutable(char)[]).__lambda11()
     62         416         416           6     pure nothrow @nogc @trusted pure nothrow @safe void function(std.stdio.File.LockingTextWriter, const(void)*, ref std.format.FormatSpec!(char).FormatSpec)* std.format.formattedWrite!(std.stdio.File.LockingTextWriter, char, immutable(char)[], immutable(char)[], immutable(char)[], immutable(char)[], immutable(char)[]).formattedWrite(std.stdio.File.LockingTextWriter, const(char[]), immutable(char)[], immutable(char)[], immutable(char)[], immutable(char)[], immutable(char)[]).__lambda13()
     62         385         385           6     pure nothrow @nogc @trusted const(void*) std.format.formattedWrite!(std.stdio.File.LockingTextWriter, char, immutable(char)[], immutable(char)[], immutable(char)[], immutable(char)[], immutable(char)[]).formattedWrite(std.stdio.File.LockingTextWriter, const(char[]), immutable(char)[], immutable(char)[], immutable(char)[], immutable(char)[], immutable(char)[]).__lambda12!(immutable(char)[]).__lambda12(return ref immutable(char)[])
    668         370         370           0     pure nothrow ref @nogc @safe std.conv.emplaceRef!(char, char, char).emplaceRef(ref char, ref char).S std.conv.emplaceRef!(char, char, char).emplaceRef(ref char, ref char).S.__ctor(ref char)
      2         386         348         174     pure ref @safe std.algorithm.iteration.__T12FilterResultS246redbus4mainFZ9__lambda1TAS3std4json9JSONValueZ.FilterResult std.algorithm.iteration.__T12FilterResultS246redbus4mainFZ9__lambda1TAS3std4json9JSONValueZ.FilterResult.__ctor(std.json.JSONValue[])
      2         583         343         171     pure nothrow @nogc @safe std.utf.byCodeUnit!(const(char)[]).byCodeUnit(const(char)[]).ByCodeUnitImpl std.utf.byUTF!(char).byUTF!(const(char)[]).byUTF(const(char)[])

Adam's answer :

➜  D ldc2 -O3 -release redbus.d
➜  D time ./redbus > /dev/null
./redbus > /dev/null  0.01s user 0.00s system 80% cpu 0.021 total
➜  D time ./redbus > /dev/null
./redbus > /dev/null  0.01s user 0.00s system 81% cpu 0.021 total
➜  D time ./redbus > /dev/null
./redbus > /dev/null  0.01s user 0.00s system 82% cpu 0.023 total
➜  D time ./redbus > /dev/null
./redbus > /dev/null  0.01s user 0.00s system 81% cpu 0.021 total
➜  D perl -ne 'print if /========/...//' trace.log | grep get_number
    120        2249        2249          18     float redbus.get_number(std.json.JSONValue)

Original run with exception :

➜  D time ./redbus > /dev/null
./redbus > /dev/null  0.01s user 0.01s system 40% cpu 0.039 total
➜  D time ./redbus > /dev/null
./redbus > /dev/null  0.01s user 0.00s system 80% cpu 0.023 total
➜  D time ./redbus > /dev/null
./redbus > /dev/null  0.01s user 0.00s system 64% cpu 0.023 total
➜  D perl -ne 'print if /========/...//' trace.log | grep get_number
    120     4971306     4966534       41387     pure @safe float redbus.get_number!(std.json.JSONValue).get_number(std.json.JSONValue)

Solution

  • I betcha just changing your get_number to this will help improve the speed a lot:

    float get_number(JSONValue item) {
      float output = 0;
      if(item.type == JSON_TYPE.FLOAT)
        output = item.floating;
      else if(item.type == JSON_TYPE.INTEGER)
        output = item.integer;
      return output;
    }
    

    Can you test it and let me know?

    EDIT: in the comment, you asked about why the profile difference isn't quite reflected in the time difference. It is, though! This individual function is now 1,000x faster... but it was already reasonably fast to begin with so it is not a huge difference in the end.

    Here's my comment explaining why you're expecting more than you should:

    The timings given in the profile trace are microseconds, not milliseconds, there's a 1000x difference between them. The trace shows a time difference between my answer and the original code of about 40,000 microseconds... or 40 milliseconds, or 0.04 seconds. Considering that profiling itself adds a bit of overhead, you wouldn't see the full 0.04 second change in the final binary.... which matches up with your numbers well enough, on average my answer gave you a 0.02s boost (or 20,000 microseconds!), which is close to matching given profiling overhead being removed too.