blob: cb94d3236dd3a2ad378bcdc785b7485c606b4952 [file] [log] [blame]
/*
* Copyright 2000-2009 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.testFramework;
import com.intellij.concurrency.JobSchedulerImpl;
import com.intellij.openapi.util.io.FileUtil;
import java.io.*;
import java.math.BigInteger;
/**
* @author peter
*/
@SuppressWarnings({"UtilityClassWithoutPrivateConstructor"})
public class Timings {
private static final int IO_PROBES = 42;
public static final long CPU_TIMING;
public static final long IO_TIMING;
public static final long MACHINE_TIMING;
/**
* Measured on dual core p4 3HZ 1gig ram
*/
public static final long ETALON_TIMING = 438;
public static final long ETALON_CPU_TIMING = 200;
public static final long ETALON_IO_TIMING = 100;
static {
int N = 20;
for (int i=0; i<N; i++) {
measureCPU(); //warmup
}
long[] elapsed=new long[N];
for (int i=0; i< N; i++) {
elapsed[i] = measureCPU();
}
CPU_TIMING = PlatformTestUtil.averageAmongMedians(elapsed, 2);
long start = System.currentTimeMillis();
for (int i = 0; i < IO_PROBES; i++) {
try {
final File tempFile = FileUtil.createTempFile("test", "test" + i);
final FileWriter writer = new FileWriter(tempFile);
try {
for (int j = 0; j < 15; j++) {
writer.write("test" + j);
writer.flush();
}
}
finally {
writer.close();
}
final FileReader reader = new FileReader(tempFile);
try {
while (reader.read() >= 0) {}
}
finally {
reader.close();
}
if (i == IO_PROBES - 1) {
final FileOutputStream stream = new FileOutputStream(tempFile);
try {
stream.getFD().sync();
}
finally {
stream.close();
}
}
if (!tempFile.delete()) {
throw new IOException("Unable to delete: " + tempFile);
}
}
catch (IOException e) {
throw new RuntimeException(e);
}
}
IO_TIMING = System.currentTimeMillis() - start;
MACHINE_TIMING = CPU_TIMING + IO_TIMING;
}
private static long measureCPU() {
long start = System.currentTimeMillis();
BigInteger k = new BigInteger("1");
for (int i = 0; i < 1000000; i++) {
k = k.add(new BigInteger("1"));
}
return System.currentTimeMillis() - start;
}
/**
* @param value the value (e.g. number of iterations) which needs to be adjusted according to my machine speed
* @param isParallelizable true if the test load is scalable with the CPU cores
* @return value calibrated according to this machine speed. For slower machine, lesser value will be returned
*/
public static int adjustAccordingToMySpeed(int value, boolean isParallelizable) {
return Math.max(1, (int)(1.0 * value * ETALON_TIMING / MACHINE_TIMING) / 8 * (isParallelizable ? JobSchedulerImpl.CORES_COUNT : 1));
}
public static String getStatistics() {
return
" Timings: CPU=" + CPU_TIMING + " (" + (int)(CPU_TIMING*1.0/ ETALON_CPU_TIMING*100) + "% of the etalon)" +
", I/O=" + IO_TIMING + " (" + (int)(IO_TIMING*1.0/ ETALON_IO_TIMING*100) + "% of the etalon)" +
", total=" + MACHINE_TIMING + " ("+(int)(MACHINE_TIMING*1.0/ ETALON_TIMING*100) + "% of the etalon) " +
Runtime.getRuntime().availableProcessors() + " cores.";
}
}