Skip to content

Commit cb61237

Browse files
committed
make tests faster
1 parent 54f8763 commit cb61237

16 files changed

+93
-35
lines changed

net.lecousin.core/src/main/java/net/lecousin/framework/application/StandaloneLCCore.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import net.lecousin.framework.concurrent.Threading;
1919
import net.lecousin.framework.concurrent.synch.ISynchronizationPoint;
2020
import net.lecousin.framework.log.Logger;
21+
import net.lecousin.framework.memory.MemoryManager;
2122
import net.lecousin.framework.util.AsyncCloseable;
2223
import net.lecousin.framework.util.DebugUtil;
2324
import net.lecousin.framework.util.Pair;
@@ -242,6 +243,11 @@ public void stop() {
242243
} while (count < 50);
243244

244245
long end = System.nanoTime();
246+
247+
StringBuilder s = new StringBuilder(2048);
248+
MemoryManager.logMemory(s);
249+
System.out.println(s.toString());
250+
245251
OperatingSystemMXBean os = ManagementFactory.getOperatingSystemMXBean();
246252
try {
247253
ClassLoader.getSystemClassLoader().loadClass("com.sun.management.OperatingSystemMXBean");

net.lecousin.core/src/main/java/net/lecousin/framework/io/LinkedIO.java

Lines changed: 40 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -872,8 +872,7 @@ protected long seekSync(SeekType type, long move) throws IOException {
872872
if (sizes.get(i) == null) {
873873
@SuppressWarnings("resource")
874874
IO.Readable.Seekable io = (IO.Readable.Seekable)ios.get(i);
875-
io.seekSync(SeekType.FROM_END, 0);
876-
sizes.set(ioIndex, Long.valueOf(io.getPosition()));
875+
sizes.set(ioIndex, Long.valueOf(io.seekSync(SeekType.FROM_END, 0)));
877876
}
878877
p += sizes.get(i).longValue();
879878
}
@@ -895,9 +894,7 @@ protected long seekSync(SeekType type, long move) throws IOException {
895894
if (s == null) {
896895
@SuppressWarnings("resource")
897896
IO.Readable.Seekable io = (IO.Readable.Seekable)ios.get(ioIndex);
898-
io.seekSync(SeekType.FROM_END, 0);
899-
s = Long.valueOf(io.getPosition());
900-
sizes.set(ioIndex, s);
897+
sizes.set(ioIndex, s = Long.valueOf(io.seekSync(SeekType.FROM_END, 0)));
901898
}
902899
if (pos + s.longValue() > move) {
903900
posInIO = move - pos;
@@ -924,8 +921,7 @@ protected int readSync(long pos, ByteBuffer buffer) throws IOException {
924921
Long s = sizes.get(i);
925922
if (s == null) {
926923
IO.Readable.Seekable io = (IO.Readable.Seekable)ios.get(i);
927-
io.seekSync(SeekType.FROM_END, 0);
928-
s = Long.valueOf(io.getPosition());
924+
s = Long.valueOf(io.seekSync(SeekType.FROM_END, 0));
929925
sizes.set(i, s);
930926
}
931927
if (p + s.longValue() > pos) {
@@ -942,11 +938,46 @@ protected int readSync(long pos, ByteBuffer buffer) throws IOException {
942938
return -1;
943939
}
944940

941+
@SuppressWarnings("resource")
945942
protected AsyncWork<Integer, IOException> readAsync(
946943
long pos, ByteBuffer buffer, RunnableWithParameter<Pair<Integer,IOException>> ondone
947944
) {
948-
// TODO better
949-
return operation(IOUtil.readAsyncUsingSync((IO.Readable.Seekable)this, pos, buffer, ondone).getOutput());
945+
long p = 0;
946+
int i = 0;
947+
while (i < ios.size()) {
948+
Long s = sizes.get(i);
949+
if (s == null) {
950+
IO.Readable.Seekable io = (IO.Readable.Seekable)ios.get(i);
951+
AsyncWork<Long, IOException> seek = io.seekAsync(SeekType.FROM_END, 0);
952+
if (!seek.isUnblocked()) {
953+
AsyncWork<Integer, IOException> result = new AsyncWork<>();
954+
int ii = i;
955+
seek.listenAsync(new Task.Cpu.FromRunnable("LinkedIO.readAsync", getPriority(), () -> {
956+
sizes.set(ii, seek.getResult());
957+
readAsync(pos, buffer, ondone).listenInline(result);
958+
}), result);
959+
return result;
960+
}
961+
sizes.set(i, s = seek.getResult());
962+
}
963+
if (p + s.longValue() > pos) {
964+
IO.Readable.Seekable io = (IO.Readable.Seekable)ios.get(i);
965+
ioIndex = i;
966+
posInIO = pos - p;
967+
AsyncWork<Integer, IOException> result = io.readAsync(pos - p, buffer, (res) -> {
968+
if (res.getValue1() != null) {
969+
posInIO += res.getValue1().intValue();
970+
LinkedIO.this.pos = pos + res.getValue1().intValue();
971+
}
972+
if (ondone != null) ondone.run(res);
973+
});
974+
return result;
975+
}
976+
p += s.longValue();
977+
i++;
978+
}
979+
if (ondone != null) ondone.run(new Pair<>(Integer.valueOf(-1), null));
980+
return new AsyncWork<>(Integer.valueOf(-1), null);
950981
}
951982

952983
protected int readFullySync(long pos, ByteBuffer buffer) throws IOException {

net.lecousin.core/src/main/java/net/lecousin/framework/io/buffering/BufferedIO.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -730,12 +730,15 @@ protected int read(byte[] buf, int offset, int len) throws IOException {
730730
}
731731

732732
protected int readSync(long pos, ByteBuffer buf) throws IOException {
733-
if (pos >= size) return -1;
733+
if (pos >= size)
734+
return -1;
734735
int bufferIndex = getBufferIndex(pos);
735736
Buffer buffer = useBufferSync(bufferIndex);
736737
int start = getBufferOffset(pos);
737738
int len = buf.remaining();
738739
if (len > buffer.len - start) len = buffer.len - start;
740+
if (len <= 0)
741+
return 0;
739742
buf.put(buffer.buffer, start, len);
740743
buffer.lastRead = System.currentTimeMillis();
741744
buffer.inUse--;

net.lecousin.core/src/main/java/net/lecousin/framework/memory/MemoryManager.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -223,10 +223,15 @@ public static void logManageableContent() {
223223
/** Log memory usage. */
224224
public static void logMemory(Level level) {
225225
//if (jvm != null) jvm.printOptions();
226+
StringBuilder s = new StringBuilder(2048);
227+
logMemory(s);
228+
logger.log(level, s.toString());
229+
}
230+
231+
public static void logMemory(StringBuilder s) {
226232
long total = Runtime.getRuntime().totalMemory();
227233
long free = Runtime.getRuntime().freeMemory();
228234
long used = total - free;
229-
StringBuilder s = new StringBuilder(2048);
230235
s.append("Memory usage: ").append(StringUtil.size(used)).append('/').append(StringUtil.size(total))
231236
.append(" (").append(StringUtil.size(free)).append(" free), max=")
232237
.append(StringUtil.size(Runtime.getRuntime().maxMemory())).append('\n');
@@ -256,7 +261,6 @@ public static void logMemory(Level level) {
256261
}
257262
s.append("]\n");
258263
}
259-
logger.log(level, s.toString());
260264
}
261265

262266
/** Free memory on memory manageable instances. */

net.lecousin.core/src/test/java/net/lecousin/framework/core/test/collections/maps/TestLongMap.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ public void testLongMapRandom() {
4242
LinkedList<Long> values = new LinkedList<>();
4343
Random rand = new Random();
4444
long value = 0;
45-
for (int i = 0; i < 5000; ++i) {
45+
for (int i = 0; i < 2500; ++i) {
4646
value += rand.nextLong();
4747
values.add(Long.valueOf(value));
4848
}

net.lecousin.core/src/test/java/net/lecousin/framework/core/test/collections/sort/TestSortedAssociatedWithInteger.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ public void testAddRemoveRandom() {
8484
Sorted.AssociatedWithInteger<Object> list = createSorted();
8585
TreeSet<Integer> order = new TreeSet<>();
8686
Random rand = new Random();
87-
for (int i = 0; i < 5000; ++i) {
87+
for (int i = 0; i < 2000; ++i) {
8888
int value = rand.nextInt();
8989
while (order.contains(Integer.valueOf(value))) value++;
9090
list.add(value, Integer.valueOf(-value));

net.lecousin.core/src/test/java/net/lecousin/framework/core/test/collections/sort/TestSortedAssociatedWithLong.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ public void testAddRemoveRandom() {
8484
Sorted.AssociatedWithLong<Object> list = createSorted();
8585
TreeSet<Long> order = new TreeSet<>();
8686
Random rand = new Random();
87-
for (int i = 0; i < 5000; ++i) {
87+
for (int i = 0; i < 2000; ++i) {
8888
long value = rand.nextLong();
8989
while (order.contains(Long.valueOf(value))) value++;
9090
list.add(value, Long.valueOf(-value));

net.lecousin.core/src/test/java/net/lecousin/framework/core/test/io/TestFragmented.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ public static class FragmentedFile {
1616
public byte[] testBuf;
1717
public int nbBuf;
1818
public File file;
19+
public int realSize;
1920
public List<RangeLong> fragments = new LinkedList<RangeLong>();
2021
}
2122

@@ -39,11 +40,11 @@ private static synchronized void generateFragmentedFiles() throws IOException {
3940

4041
private static void generateFragmentedFile(FragmentedFile f) throws IOException {
4142
int size = f.testBuf.length * f.nbBuf;
42-
int realSize = size * 3;
43-
System.out.println("Generating fragmented file of " + f.nbBuf + " buffers (size = " + size + ", real = " + realSize + ")");
43+
f.realSize = size * 3;
44+
System.out.println("Generating fragmented file of " + f.nbBuf + " buffers (size = " + size + ", real = " + f.realSize + ")");
4445
RandomAccessFile file = new RandomAccessFile(f.file, "rw");
45-
file.setLength(realSize);
46-
FragmentedRangeInteger free = new FragmentedRangeInteger(new RangeInteger(0, realSize));
46+
file.setLength(f.realSize);
47+
FragmentedRangeInteger free = new FragmentedRangeInteger(new RangeInteger(0, f.realSize - 1));
4748
int pos = 0;
4849
int maxWriteLen;
4950
if (size < 65536) maxWriteLen = 1024;

net.lecousin.core/src/test/java/net/lecousin/framework/core/test/io/TestReadWrite.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,8 @@ public <T extends IO.Readable.Seekable & IO.Writable.Seekable> void testWriteThe
7272
@Test(timeout=120000)
7373
public <T extends IO.Readable.Seekable & IO.Writable.Seekable> void testRandomWriteAndReadAsync() throws Exception {
7474
Assume.assumeTrue(nbBuf > 0);
75+
int nbBuf = this.nbBuf;
76+
if (nbBuf > 25000) nbBuf = 25000; // make test faster
7577
T io = openReadWrite();
7678
LinkedList<Integer> buffersToWrite = new LinkedList<>();
7779
LinkedList<Integer> buffersToRead = new LinkedList<>();
@@ -84,7 +86,7 @@ public <T extends IO.Readable.Seekable & IO.Writable.Seekable> void testRandomWr
8486
prevWrite = writeBuffer(io, prevWrite, buffersToWrite, buffersToRead);
8587
prevRead = readBuffer(io, prevWrite, prevRead, buffersToRead);
8688
// make some pauses to avoid stack overflow
87-
if ((i % 10) == 8) {
89+
if ((i % 17) == 8) {
8890
prevRead.blockThrow(0);
8991
prevRead = null;
9092
prevWrite = null;

net.lecousin.core/src/test/java/net/lecousin/framework/core/test/io/TestReadableSeekable.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -48,9 +48,9 @@ public void testSeekableByteByByteSync() throws Exception {
4848
for (int i = 0; i < nbBuf; ++i) offsets.add(Integer.valueOf(i));
4949
boolean faster = false;
5050
while (!offsets.isEmpty()) {
51-
if (nbBuf > 1000 && (offsets.size() % 100) == 99) {
51+
if (nbBuf > 1000 && (offsets.size() % 100) == 50) {
5252
// make the test faster
53-
for (int skip = 0; skip < 80 && !offsets.isEmpty(); ++skip)
53+
for (int skip = 0; skip < 120 && !offsets.isEmpty(); ++skip)
5454
offsets.remove(rand.nextInt(offsets.size()));
5555
continue;
5656
}
@@ -136,9 +136,9 @@ public void run() {
136136
// read again to test we cannot read beyond the end of the file
137137
offset.set(nbBuf-1);
138138
} else {
139-
if (nbBuf > 1000 && (offsets.size() % 100) == 99) {
139+
if (nbBuf > 1000 && (offsets.size() % 100) == 60) {
140140
// make the test faster
141-
for (int skip = 0; skip < 80 && offsets.size() > 1; ++skip)
141+
for (int skip = 0; skip < 130 && offsets.size() > 1; ++skip)
142142
offsets.remove(rand.nextInt(offsets.size()));
143143
}
144144

@@ -272,7 +272,7 @@ public void run() {
272272
@Test(timeout=300000)
273273
public void testConcurrentAccessToSeekableBufferByBufferFullyAsync() throws Exception {
274274
IO.Readable.Seekable io = createReadableSeekableFromFile(openFile(), getFileSize());
275-
int nbConc = Runtime.getRuntime().availableProcessors() * 5;
275+
int nbConc = Runtime.getRuntime().availableProcessors() * 3;
276276
JoinPoint<Exception> jp = new JoinPoint<>();
277277
jp.addToJoin(nbConc);
278278
for (int t = 0; t < nbConc; ++t) {

0 commit comments

Comments
 (0)