Browse Source

fixing speedtest for multithreading

pull/2/head
heck 5 years ago
parent
commit
25f32c536e
  1. 204
      test/java/foundation/pEp/jniadapter/test/speedtest/SpeedTest.java

204
test/java/foundation/pEp/jniadapter/test/speedtest/SpeedTest.java

@ -6,6 +6,7 @@ import java.nio.file.Paths;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.util.Vector; import java.util.Vector;
import java.util.Scanner; import java.util.Scanner;
import foundation.pEp.jniadapter.*; import foundation.pEp.jniadapter.*;
public class SpeedTest { public class SpeedTest {
@ -14,15 +15,14 @@ public class SpeedTest {
private static Identity me = new Identity(true); private static Identity me = new Identity(true);
private static Identity you = new Identity(); private static Identity you = new Identity();
protected static void decodingTest(long n, String testDataEnc) { protected static void decodingTest(Engine eng, long n, String testDataEnc) {
for (long i=0; i<n; ++i) { for (long i = 0; i < n; ++i) {
try { try {
Message[] msgs = codec.decode(testDataEnc); Message[] msgs = codec.decode(testDataEnc);
Vector<String> keys = new Vector<String>(); Vector<String> keys = new Vector<String>();
Engine.decrypt_message_Return ret = pEp.decrypt_message(msgs[0], keys, 0); Engine.decrypt_message_Return ret = eng.decrypt_message(msgs[0], keys, 0);
String txt = ret.dst.getLongmsg(); String txt = ret.dst.getLongmsg();
} } catch (ParseException ex) {
catch (ParseException ex) {
System.err.println("error: parsing test data"); System.err.println("error: parsing test data");
System.exit(3); System.exit(3);
} }
@ -32,19 +32,20 @@ public class SpeedTest {
protected class DecodingThread extends Thread { protected class DecodingThread extends Thread {
private long _n; private long _n;
private String _testDataEnc; private String _testDataEnc;
private Engine _localpEp;
public DecodingThread(long n, String testDataEnc) public DecodingThread(long n, String testDataEnc) {
{
_n = n; _n = n;
_testDataEnc = testDataEnc; _testDataEnc = testDataEnc;
_localpEp = new Engine();
} }
public void run() { public void run() {
decodingTest(_n, _testDataEnc); decodingTest(_localpEp, _n, _testDataEnc);
} }
} }
private static Message encrypt(String data) { private static Message encrypt(Engine eng, String data) {
Message m = new Message(); Message m = new Message();
m.setDir(Message.Direction.Outgoing); m.setDir(Message.Direction.Outgoing);
m.setFrom(me); m.setFrom(me);
@ -52,12 +53,12 @@ public class SpeedTest {
to.add(you); to.add(you);
m.setTo(to); m.setTo(to);
m.setLongmsg(data); m.setLongmsg(data);
return pEp.encrypt_message(m, null, Message.EncFormat.Inline); return eng.encrypt_message(m, null, Message.EncFormat.Inline);
} }
protected static void encodingTest(long n, String testData) { protected static void encodingTest(Engine eng, long n, String testData) {
for (long i=0; i<n; ++i) { for (long i = 0; i < n; ++i) {
Message enc = encrypt(testData); Message enc = encrypt(eng, testData);
String txt = codec.encode(enc, null); String txt = codec.encode(enc, null);
} }
} }
@ -65,21 +66,22 @@ public class SpeedTest {
protected class EncodingThread extends Thread { protected class EncodingThread extends Thread {
private long _n; private long _n;
private String _testData; private String _testData;
private Engine _localpEp;
public EncodingThread(long n, String testData) public EncodingThread(long n, String testData) {
{
_n = n; _n = n;
_testData = testData; _testData = testData;
_localpEp = new Engine();
} }
public void run() { public void run() {
encodingTest(_n, _testData); encodingTest(_localpEp, _n, _testData);
} }
} }
public static void main(String[] args) { public static void main(String[] args) {
long decoding = 0; long decodingCount = 0;
long encoding = 0; long encodingCount = 0;
int deth = 1; int deth = 1;
int enth = 1; int enth = 1;
@ -89,9 +91,8 @@ public class SpeedTest {
MT999 testMessage = new MT999("232323232323", "424242424242", "O", "23", "", "Hello, world"); MT999 testMessage = new MT999("232323232323", "424242424242", "O", "23", "", "Hello, world");
String testData = testMessage.toString(); String testData = testMessage.toString();
for (int i=0; i<args.length; ++i) { for (int i = 0; i < args.length; ++i) {
if (args[i].compareTo("-h") == 0 || args[i].compareTo("--help") ==0) if (args[i].compareTo("-h") == 0 || args[i].compareTo("--help") == 0) {
{
System.out.println("SpeedTest [-e |--encode NUMBER] [-d | --decode NUMBER] [-f | --file TESTDATA] [-jd | --decoding-threads DT] [-je | --encoding-threads] [-h | --help]\n" System.out.println("SpeedTest [-e |--encode NUMBER] [-d | --decode NUMBER] [-f | --file TESTDATA] [-jd | --decoding-threads DT] [-je | --encoding-threads] [-h | --help]\n"
+ "\nEncodes and/or decodes messages to measure the speed.\n\n" + "\nEncodes and/or decodes messages to measure the speed.\n\n"
+ " -d, --decode NUMBER decode NUMBER messages\n" + " -d, --decode NUMBER decode NUMBER messages\n"
@ -104,43 +105,35 @@ public class SpeedTest {
+ "NUMBER times, respectively. If you omit -f it will encode a default data set.\n" + "NUMBER times, respectively. If you omit -f it will encode a default data set.\n"
); );
System.exit(0); System.exit(0);
} } else if (args[i].compareTo("-d") == 0 || args[i].compareTo("--decode") == 0) {
else if (args[i].compareTo("-d") == 0 || args[i].compareTo("--decode") == 0) {
try { try {
decoding = Long.parseLong(args[i+1]); decodingCount = Long.parseLong(args[i + 1]);
++i; ++i;
} } catch (NumberFormatException ex) {
catch (NumberFormatException ex) { System.err.println(String.format("error: decimal number expected but found %s", args[i + 1]));
System.err.println(String.format("error: decimal number expected but found %s", args[i+1]));
System.exit(1); System.exit(1);
} } catch (ArrayIndexOutOfBoundsException ex) {
catch (ArrayIndexOutOfBoundsException ex) {
System.err.println(String.format("error: %s is requiring a decimal number as argument", args[i])); System.err.println(String.format("error: %s is requiring a decimal number as argument", args[i]));
System.exit(1); System.exit(1);
} }
} } else if (args[i].compareTo("-e") == 0 || args[i].compareTo("--encode") == 0) {
else if (args[i].compareTo("-e") == 0 || args[i].compareTo("--encode") == 0) {
try { try {
encoding = Long.parseLong(args[i+1]); encodingCount = Long.parseLong(args[i + 1]);
++i; ++i;
} } catch (NumberFormatException ex) {
catch (NumberFormatException ex) { System.err.println(String.format("error: decimal number expected but found %s", args[i + 1]));
System.err.println(String.format("error: decimal number expected but found %s", args[i+1]));
System.exit(1); System.exit(1);
} } catch (ArrayIndexOutOfBoundsException ex) {
catch (ArrayIndexOutOfBoundsException ex) {
System.err.println(String.format("error: %s is requiring a decimal number as argument", args[i])); System.err.println(String.format("error: %s is requiring a decimal number as argument", args[i]));
System.exit(1); System.exit(1);
} }
} } else if (args[i].compareTo("-f") == 0 || args[i].compareTo("--file") == 0) {
else if (args[i].compareTo("-f") == 0 || args[i].compareTo("--file") == 0) {
String filename = ""; String filename = "";
try { try {
filename = args[i+1]; filename = args[i + 1];
++i; ++i;
} } catch (ArrayIndexOutOfBoundsException ex) {
catch (ArrayIndexOutOfBoundsException ex) {
System.err.println(String.format("error: %s is requiring a filename as argument", args[i])); System.err.println(String.format("error: %s is requiring a filename as argument", args[i]));
System.exit(1); System.exit(1);
} }
@ -149,52 +142,43 @@ public class SpeedTest {
if (filename.compareTo("-") == 0) { if (filename.compareTo("-") == 0) {
Scanner s = new Scanner(System.in).useDelimiter("\\A"); Scanner s = new Scanner(System.in).useDelimiter("\\A");
testData = s.hasNext() ? s.next() : ""; testData = s.hasNext() ? s.next() : "";
} } else {
else {
testData = new String(Files.readAllBytes(Paths.get(filename)), StandardCharsets.UTF_8); testData = new String(Files.readAllBytes(Paths.get(filename)), StandardCharsets.UTF_8);
} }
} } catch (Exception ex) {
catch (Exception ex) {
System.err.println(String.format("error: cannot read file %s", args[i])); System.err.println(String.format("error: cannot read file %s", args[i]));
System.exit(2); System.exit(2);
} }
} } else if (args[i].compareTo("-jd") == 0 || args[i].compareTo("----decoding-threads") == 0) {
else if (args[i].compareTo("-jd") == 0 || args[i].compareTo("----decoding-threads") == 0) {
try { try {
deth = Integer.parseInt(args[i+1]); deth = Integer.parseInt(args[i + 1]);
++i; ++i;
} } catch (NumberFormatException ex) {
catch (NumberFormatException ex) { System.err.println(String.format("error: decimal number expected but found %s", args[i + 1]));
System.err.println(String.format("error: decimal number expected but found %s", args[i+1]));
System.exit(1); System.exit(1);
} } catch (ArrayIndexOutOfBoundsException ex) {
catch (ArrayIndexOutOfBoundsException ex) {
System.err.println(String.format("error: %s is requiring a decimal number as argument", args[i])); System.err.println(String.format("error: %s is requiring a decimal number as argument", args[i]));
System.exit(1); System.exit(1);
} }
} } else if (args[i].compareTo("-je") == 0 || args[i].compareTo("----encoding-threads") == 0) {
else if (args[i].compareTo("-je") == 0 || args[i].compareTo("----encoding-threads") == 0) {
try { try {
enth = Integer.parseInt(args[i+1]); enth = Integer.parseInt(args[i + 1]);
++i; ++i;
} } catch (NumberFormatException ex) {
catch (NumberFormatException ex) { System.err.println(String.format("error: decimal number expected but found %s", args[i + 1]));
System.err.println(String.format("error: decimal number expected but found %s", args[i+1]));
System.exit(1); System.exit(1);
} } catch (ArrayIndexOutOfBoundsException ex) {
catch (ArrayIndexOutOfBoundsException ex) {
System.err.println(String.format("error: %s is requiring a decimal number as argument", args[i])); System.err.println(String.format("error: %s is requiring a decimal number as argument", args[i]));
System.exit(1); System.exit(1);
} }
} } else {
else {
System.err.println(String.format("illegal parameter: %s", args[i])); System.err.println(String.format("illegal parameter: %s", args[i]));
System.exit(1); System.exit(1);
} }
} }
if (decoding < 0 || encoding < 0 || !(encoding > 0 || decoding > 0)) { if (decodingCount < 0 || encodingCount < 0 || !(encodingCount > 0 || decodingCount > 0)) {
System.err.println("arguments error: -d or -e (or both) must be used with a positive number"); System.err.println("arguments error: -d or -e (or both) must be used with a positive number");
System.exit(1); System.exit(1);
} }
@ -214,65 +198,83 @@ public class SpeedTest {
you.user_id = me.user_id; you.user_id = me.user_id;
pEp.myself(you); // make a key for it pEp.myself(you); // make a key for it
Message enc = encrypt(testData); Message enc = encrypt(pEp, testData);
String testDataEnc = codec.encode(enc, null); String testDataEnc = codec.encode(enc, null);
Thread[] dts = new Thread[deth];
Thread[] ets = new Thread[enth];
System.out.println("Initializing...");
System.out.println("Creating "+ deth + " decoding threads");
// create threads
if (deth > 1) {
SpeedTest st = new SpeedTest();
for (int i = 0; i < deth; ++i) {
dts[i] = st.new DecodingThread(decodingCount, testDataEnc);
}
}
System.out.println("Creating "+ enth + " encoding threads");
if (enth > 1) {
SpeedTest st = new SpeedTest();
for (int i = 0; i < enth; ++i) {
ets[i] = st.new EncodingThread(encodingCount, testData);
}
}
// Benchmark starting
System.out.println("Starting benchmark...");
System.out.println("decoding...");
long startTime = System.nanoTime(); long startTime = System.nanoTime();
if (decoding > 0) { if (deth == 1) {
if (deth == 1) { decodingTest(pEp, decodingCount, testDataEnc);
decodingTest(decoding, testDataEnc); } else {
SpeedTest st = new SpeedTest();
for (int i = 0; i < deth; ++i) {
dts[i].start();
} }
else { for (int i = 0; i < deth; ++i) {
SpeedTest st = new SpeedTest(); try {
Thread[] dts = new Thread[deth]; dts[i].join();
for (int i=0; i < deth; ++i) { } catch (InterruptedException ex) {
dts[i] = st.new DecodingThread(decoding, testDataEnc);
dts[i].start();
}
for (int i=0; i < deth; ++i) {
try {
dts[i].join();
}
catch (InterruptedException ex) { }
} }
} }
} }
long decodingTime = System.nanoTime(); long decodingTime = System.nanoTime();
long decodingDelta = decodingTime - startTime; long decodingDelta = decodingTime - startTime;
if (encoding > 0) { System.out.println("encoding...");
if (enth == 1) { if (enth == 1) {
encodingTest(decoding, testData); encodingTest(pEp, decodingCount, testData);
} else {
SpeedTest st = new SpeedTest();
for (int i = 0; i < enth; ++i) {
ets[i].start();
} }
else { for (int i = 0; i < enth; ++i) {
SpeedTest st = new SpeedTest(); try {
Thread[] ets = new Thread[enth]; ets[i].join();
for (int i=0; i < enth; ++i) { } catch (InterruptedException ex) {
ets[i] = st.new EncodingThread(encoding, testData);
ets[i].start();
}
for (int i=0; i < enth; ++i) {
try {
ets[i].join();
}
catch (InterruptedException ex) { }
} }
} }
} }
long encodingDelta = System.nanoTime() - decodingTime; long encodingDelta = System.nanoTime() - decodingTime;
double ent = (double) encodingDelta / 1000000000; double encTimeSecs = (double) encodingDelta / 1000000000;
double det = (double) decodingDelta / 1000000000; double decTimeSecs = (double) decodingDelta / 1000000000;
double enr = (double) encoding / ent; double enr = (double) encodingCount * enth / encTimeSecs;
double der = (double) decoding / det; double der = (double) decodingCount * deth / decTimeSecs;
System.out.println(String.format( System.out.println(String.format(
"encrypted and encoded %d messages in %.3f sec. (%.1f msg./sec. per core)\n" "encrypted and encoded %d messages in %.3f sec. (%.1f msg./sec. per core)\n"
+ "decrypted and decoded %d messages in %.3f sec. (%.1f msg./sec. per core)", + "decrypted and decoded %d messages in %.3f sec. (%.1f msg./sec. per core)",
encoding, ent, enr, decoding, det, der)); encodingCount, encTimeSecs, enr, decodingCount, decTimeSecs, der));
} }
} }

Loading…
Cancel
Save