@Override
  public void notifyCompilationSuccess(
      OptimizedCallTarget target,
      TruffleInlining inliningDecision,
      StructuredGraph graph,
      CompilationResult result) {
    success++;
    long compilationDone = System.nanoTime();

    CompilationLocal local = compilationLocal.get();

    compilationTime.accept(compilationDone - local.compilationStarted);
    compilationTimeTruffleTier.accept(local.truffleTierFinished - local.compilationStarted);
    compilationTimeGraalTier.accept(local.graalTierFinished - local.truffleTierFinished);
    compilationTimeCodeInstallation.accept(compilationDone - local.graalTierFinished);

    compilationResultCodeSize.accept(result.getTargetCodeSize());
    compilationResultTotalFrameSize.accept(result.getTotalFrameSize());
    compilationResultExceptionHandlers.accept(result.getExceptionHandlers().size());
    compilationResultInfopoints.accept(result.getInfopoints().size());
    compilationResultInfopointStatistics.accept(
        result.getInfopoints().stream().map(e -> e.reason.toString()));
    compilationResultMarks.accept(result.getMarks().size());
    compilationResultDataPatches.accept(result.getDataPatches().size());
  }
  public void printStatistics(GraalTruffleRuntime rt) {
    long endTime = System.nanoTime();
    rt.log("Truffle compilation statistics:");
    printStatistic(rt, "Compilations", compilations);
    printStatistic(rt, "  Success", success);
    printStatistic(rt, "  Failed", failures);
    printStatistic(rt, "  Interrupted", compilations - (success + failures));
    printStatistic(rt, "Invalidated", invalidations);
    printStatistic(rt, "Queues", queues);
    printStatistic(rt, "Dequeues", dequeues);
    printStatistic(rt, "Splits", splits);
    printStatistic(rt, "Compilation Accuracy", 1.0 - invalidations / (double) compilations);
    printStatistic(rt, "Queue Accuracy", 1.0 - dequeues / (double) queues);
    printStatistic(
        rt,
        "Compilation Utilization",
        compilationTime.getSum() / (double) (endTime - firstCompilation));
    printStatistic(rt, "Remaining Compilation Queue", rt.getCompilationQueueSize());
    printStatistic(rt, "Times defered until compilation", deferCompilations);

    printStatisticTime(rt, "Time to queue", timeToQueue);
    printStatisticTime(rt, "Time to compilation", timeToCompilation);

    printStatisticTime(rt, "Compilation time", compilationTime);
    printStatisticTime(rt, "  Truffle Tier", compilationTimeTruffleTier);
    printStatisticTime(rt, "  Graal Tier", compilationTimeGraalTier);
    printStatisticTime(rt, "  Code Installation", compilationTimeCodeInstallation);

    printStatistic(rt, "Truffle node count", nodeCount);
    printStatistic(rt, "  Trivial", nodeCountTrivial);
    printStatistic(rt, "  Non Trivial", nodeCountNonTrivial);
    printStatistic(rt, "    Monomorphic", nodeCountMonomorphic);
    printStatistic(rt, "    Polymorphic", nodeCountPolymorphic);
    printStatistic(rt, "    Megamorphic", nodeCountMegamorphic);
    printStatistic(rt, "Truffle call count", callCount);
    printStatistic(rt, "  Indirect", callCountIndirect);
    printStatistic(rt, "  Direct", callCountDirect);
    printStatistic(rt, "    Dispatched", callCountDirectDispatched);
    printStatistic(rt, "    Inlined", callCountDirectInlined);
    printStatistic(rt, "    ----------");
    printStatistic(rt, "    Cloned", callCountDirectCloned);
    printStatistic(rt, "    Not Cloned", callCountDirectNotCloned);
    printStatistic(rt, "Truffle loops", loopCount);
    printStatistic(rt, "Graal node count");
    printStatistic(rt, "  After Truffle Tier", truffleTierNodeCount);
    printStatistic(rt, "  After Graal Tier", graalTierNodeCount);

    printStatistic(rt, "Graal comilation result");
    printStatistic(rt, "  Code size", compilationResultCodeSize);
    printStatistic(rt, "  Total frame size", compilationResultTotalFrameSize);
    printStatistic(rt, "  Exception handlers", compilationResultExceptionHandlers);
    printStatistic(rt, "  Infopoints", compilationResultInfopoints);
    compilationResultInfopointStatistics.printStatistics(rt, identity());
    printStatistic(rt, "  Marks", compilationResultMarks);
    printStatistic(rt, "  Data references", compilationResultDataPatches);

    if (TruffleCompilerOptions.TruffleCompilationStatisticDetails.getValue()) {
      printStatistic(rt, "Truffle nodes");
      nodeStatistics.printStatistics(rt, Class::getSimpleName);
      printStatistic(rt, "Graal nodes after Truffle tier");
      truffleTierNodeStatistics.printStatistics(rt, Class::getSimpleName);
      printStatistic(rt, "Graal nodes after Graal tier");
      graalTierNodeStatistics.printStatistics(rt, Class::getSimpleName);
    }
  }