/*
* Copyright 2015
* Ubiquitous Knowledge Processing (UKP) Lab
* Technische Universität Darmstadt
*
* 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 org.dkpro.lab.task.impl;
import org.apache.commons.io.FileUtils;
import org.dkpro.lab.Lab;
import org.dkpro.lab.engine.TaskContext;
import org.dkpro.lab.storage.impl.PropertiesAdapter;
import org.dkpro.lab.task.Task;
import org.dkpro.lab.task.impl.DefaultBatchTask;
import org.dkpro.lab.task.impl.ExecutableTaskBase;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TestName;
import java.io.File;
import java.util.*;
public class MultiThreadTaskPerformanceTest
{
private DefaultBatchTask batchTask;
@Rule
public TestName name = new TestName();
@Before
public void setup()
{
File path = new File("target/repository/" + getClass().getSimpleName() + "/"
+ name.getMethodName());
System.setProperty("DKPRO_HOME", path.getAbsolutePath());
FileUtils.deleteQuietly(path);
// batchTask = new BatchTask();
batchTask = new DefaultBatchTask();
}
static class DummyTask
extends ExecutableTaskBase
{
@Override
public void execute(TaskContext aContext)
throws Exception
{
Properties data = new Properties();
data.setProperty("key", "value");
aContext.storeBinary("DATA", new PropertiesAdapter(data));
}
}
@Test
public void testRandomWiring()
throws Exception
{
Random random = new Random(0);
List<List<Task>> layersOfTasks = new ArrayList<>();
int layerSize = 100;
int layersNumber = 4;
int importsInEachLayer = 100;
// create three layers with tasks
for (int j = 0; j < layersNumber; j++) {
// add a new layer if needed
if (layersOfTasks.size() <= j) {
layersOfTasks.add(new ArrayList<Task>());
}
for (int i = 0; i < layerSize; i++) {
Task t = new DummyTask();
((ExecutableTaskBase) t).setType(String.format("%d-%d", j, i));
layersOfTasks.get(j).add(t);
}
}
// wire tasks in layers
for (int l = 1; l < layersNumber; l++) {
for (int j = l - 1; j >= 0; j--) {
for (int i = 0; i < importsInEachLayer; i++) {
Task t1 = layersOfTasks.get(l).get(random.nextInt(layerSize));
Task t2 = layersOfTasks.get(j).get(random.nextInt(layerSize));
t1.addImport(t2, "DATA");
}
}
}
// shuffle all tasks
List<Task> allTasksShuffled = new ArrayList<>();
for (List<Task> tasks : layersOfTasks) {
allTasksShuffled.addAll(tasks);
}
Collections.shuffle(allTasksShuffled);
for (Task t : allTasksShuffled) {
batchTask.addTask(t);
}
Lab.getInstance().run(batchTask);
}
}