// Copyright (c) 2017, the R8 project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
package com.android.tools.r8;

import com.android.tools.r8.utils.ThreadUtils;
import java.io.IOException;
import java.nio.file.Paths;
import java.util.concurrent.ExecutorService;

public class IncrementalDexingBenchmark {
  private static final int ITERATIONS = 1000;

  public static void compile(ExecutorService executor) throws IOException, CompilationException {
    D8Output output =
        D8.run(
            D8Command.builder()
                .addProgramFiles(Paths.get("build/test/examples/arithmetic.jar"))
                .setMode(CompilationMode.DEBUG)
                .build(),
            executor);
    if (output.getDexResources().size() != 1) {
      throw new RuntimeException("WAT");
    }
  }

  public static void main(String[] args) throws IOException, CompilationException {
    int threads = Integer.min(Runtime.getRuntime().availableProcessors(), 16) / 2;
    ExecutorService executor = ThreadUtils.getExecutorService(threads);
    try {
      long start = System.nanoTime();
      for (int i = 0; i < ITERATIONS; i++) {
        compile(executor);
      }
      double elapsedMs = (System.nanoTime() - start) / 1000000.0;
      System.out.println("IncrementalDexing(RunTime): " + elapsedMs + " ms");
    } finally {
      executor.shutdown();
    }
  }
}
