Package net.sf.robocode.host

Source Code of net.sf.robocode.host.CpuManager

/**
* Copyright (c) 2001-2014 Mathew A. Nelson and Robocode contributors
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://robocode.sourceforge.net/license/epl-v10.html
*/
package net.sf.robocode.host;


import net.sf.robocode.core.Container;
import net.sf.robocode.io.Logger;
import net.sf.robocode.settings.ISettingsManager;
import net.sf.robocode.ui.IWindowManager;


/**
* @author Mathew A. Nelson (original)
* @author Flemming N. Larsen (contributor)
* @author Robert Maupin (contributor)
* @author Pavel Savara (contributor)
*/
public class CpuManager implements ICpuManager { // NO_UCD (use default)
  private final static int APPROXIMATE_CYCLES_ALLOWED = 6250;
  private final static int TEST_PERIOD_MILLIS = 5000;

  private long cpuConstant = -1;
  private final ISettingsManager properties;

  public CpuManager(ISettingsManager properties) { // NO_UCD (unused code)
    this.properties = properties;
  }

  public long getCpuConstant() {
    if (cpuConstant == -1) {
      cpuConstant = properties.getCpuConstant();
      if (cpuConstant == -1) {
        calculateCpuConstant();
      }
    }
    return cpuConstant;
  }

  public void calculateCpuConstant() {
    setStatus("Estimating CPU speed, please wait...");

    setCpuConstant();
    Logger.logMessage(
        "Each robot will be allowed a maximum of " + cpuConstant + " nanoseconds per turn on this system.");

    properties.setCpuConstant(cpuConstant);
    properties.saveProperties();

    setStatus("");
  }

  private void setCpuConstant() {
    long count = 0;
    double d = 0;

    long start = System.currentTimeMillis();

    while (System.currentTimeMillis() - start < TEST_PERIOD_MILLIS) {
      d += Math.hypot(Math.sqrt(Math.abs(Math.log(Math.atan(Math.random())))),
          Math.cbrt(Math.abs(Math.random() * 10)))
          / Math.exp(Math.random());
      count++;
    }

    // to cheat optimizer, almost never happen
    if (d == 0.0) {
      Logger.logMessage("bingo!");
    }

    cpuConstant = Math.max(1, (long) (1000000.0 * APPROXIMATE_CYCLES_ALLOWED * TEST_PERIOD_MILLIS / count));
  }

  private void setStatus(String message) {
    IWindowManager windowManager = Container.getComponent(IWindowManager.class);

    if (windowManager != null) {
      windowManager.setStatus(message);
    }
  }

}
TOP

Related Classes of net.sf.robocode.host.CpuManager

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.