Я хочу преобразовать приведенный ниже императивный код в функциональный код, используя Java 8.
Как это работает, я фиксирую текущее время до и после вызова API, а затем вычитаю предыдущее из последующего.Результатом является трудоемкое время выполнения API, я также обращаю внимание на использование памяти.Я собираю время отклика и данные об использовании памяти в 2 списка, которые затем обрабатываю.
Так как сохранить текущую функциональность при преобразовании в функциональный код?
Simulator simulator = new Simulator();
List<Double> execTimes = new ArrayList<>();
List<Long> execMemory = new ArrayList<>();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 1000; i++)
{
Runtime runtime = Runtime.getRuntime();
runtime.gc();
Long startTime = System.currentTimeMillis();
byte[] dataBytes = simulator.generateData(simulator.readFileAsString(input)); // API to measure
long memoryUsed = runtime.totalMemory() - runtime.freeMemory(); // capture memory usage
Long stopTime = System.currentTimeMillis();
Long time = stopTime - startTime; // measure api response time
sb.append(i).append(',').append(time)
.append(',').append(memoryUsed).append(',').append("\n");
simulator.writeToFile(new File(inputDoc), dataBytes, i);
execMemory.add(memoryUsed);
execTimes.add(time.doubleValue());
System.out.println("Execution time (MS): "+(time));
System.out.println("Memory usage (B) ["+i+"]: "+memoryUsed);
}
Это на самом деле не работает:
IntStream.range(0, 1000)
.forEach(i ->
simulator.generateData(simulator.readFileAsString(inputDoc)) );
Я пытался использовать диапазон, но я не уверен, что это правильный вариант использования для Integer Stream, так как он не работаетучитывайте другие украшения, такие как время отклика.Возможно, здесь будет работать монада?