// 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.benchmarks;

import com.android.tools.r8.CompilationException;
import com.android.tools.r8.CompilationFailedException;
import com.android.tools.r8.CompilationMode;
import com.android.tools.r8.D8;
import com.android.tools.r8.D8Command;
import com.android.tools.r8.DexIndexedConsumer;
import com.android.tools.r8.DiagnosticsHandler;
import com.android.tools.r8.utils.ThreadUtils;
import java.io.IOException;
import java.nio.file.Paths;
import java.util.Set;
import java.util.concurrent.ExecutorService;

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

  public static void compile(ExecutorService executor)
      throws IOException, CompilationException, CompilationFailedException {
    D8.run(
        D8Command.builder()
            .addProgramFiles(Paths.get("build/test/examples/arithmetic.jar"))
            .setMode(CompilationMode.DEBUG)
            .setDisableDesugaring(true)
            .setProgramConsumer(
                new DexIndexedConsumer.ForwardingConsumer(null) {
                  @Override
                  public void accept(
                      int fileIndex,
                      byte[] data,
                      Set<String> descriptors,
                      DiagnosticsHandler handler) {
                    if (fileIndex != 0) {
                      throw new RuntimeException("WAT");
                    }
                  }
                })
            .build(),
        executor);
  }

  public static void main(String[] args)
      throws IOException, CompilationException, CompilationFailedException {
    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;
      BenchmarkUtils.printRuntimeMilliseconds("IncrementalDexing", elapsedMs);
    } finally {
      executor.shutdown();
    }
  }
}
