Browse Source

find problem that many communication.write() will generate much overhead

Boyoung- 8 years ago
parent
commit
035a4e7a10
3 changed files with 63 additions and 10 deletions
  1. 18 6
      src/communication/Communication.java
  2. 25 2
      src/protocols/Access.java
  3. 20 2
      test/misc/HelloWorld.java

+ 18 - 6
src/communication/Communication.java

@@ -12,6 +12,7 @@ import java.net.Socket;
 import java.net.SocketException;
 import java.nio.charset.Charset;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.concurrent.BlockingQueue;
 import java.util.concurrent.LinkedBlockingQueue;
 
@@ -362,10 +363,11 @@ public class Communication {
 	public void write(Tuple[] tuples) {
 		write(tuples.length);
 		for (int i=0; i<tuples.length; i++) {
-			write(tuples[i].getF());
-			write(tuples[i].getN());
-			write(tuples[i].getL());
-			write(tuples[i].getA());
+			write(tuples[i].getF().length);
+			write(tuples[i].getN().length);
+			write(tuples[i].getL().length);
+			write(tuples[i].getA().length);
+			write(tuples[i].toByteArray());
 		}
 	}
 
@@ -488,8 +490,18 @@ public class Communication {
 	public Tuple[] readTupleArray() {
 		int len = readInt();
 		Tuple[] tuples = new Tuple[len];
-		for (int i=0; i<len; i++)
-			tuples[i] = new Tuple(read(), read(), read(), read());
+		for (int i=0; i<len; i++) {
+			int f = readInt();
+			int n = readInt();
+			int l = readInt();
+			int a = readInt();
+			tuples[i] = new Tuple(new byte[f], new byte[n], new byte[l], new byte[a]);
+			byte[] data = read();
+			tuples[i].setF(Arrays.copyOfRange(data, 0, f));
+			tuples[i].setN(Arrays.copyOfRange(data, f, f+n));
+			tuples[i].setL(Arrays.copyOfRange(data, f+n, f+n+l));
+			tuples[i].setA(Arrays.copyOfRange(data, f+n+l, data.length));
+		}
 		return tuples;
 	}
 

+ 25 - 2
src/protocols/Access.java

@@ -124,10 +124,17 @@ public class Access extends Protocol {
 		pathTuples = Arrays.copyOf(objArray, objArray.length, Tuple[].class);
 		step1.stop();
 
+		byte[] test = Util.nextBytes(pathTuples.length*pathTuples[0].getNumBytes(), Crypto.sr);
+		
 		step2.start();
 		// step 2
-		con2.write(pathTuples);
+		//con2.write(pathTuples);
+		con2.write(pathTuples.length);
+		for (int i=0; i<pathTuples.length; i++)
+			con2.write(pathTuples[i].toByteArray());
 		con2.write(Ni);
+		
+		//con2.write(test);
 		step2.stop();
 
 		step3.start();
@@ -168,8 +175,24 @@ public class Access extends Protocol {
 		// step 2
 		//Object[] objArray = con2.readObjectArray();
 		//Tuple[] pathTuples = Arrays.copyOf(objArray, objArray.length, Tuple[].class);
-		Tuple[] pathTuples = con2.readTupleArray();
+		//Tuple[] pathTuples = con2.readTupleArray();
+		int numTuples = con2.readInt();
+		Tuple[] pathTuples = new Tuple[numTuples];
+		for (int i=0; i<numTuples; i++) {
+			byte[] data = con2.read();
+			int f = treeIndex==0?0:1;
+			int n = md.getNBytesOfTree(treeIndex);
+			int l = md.getLBytesOfTree(treeIndex);
+			int a = md.getABytesOfTree(treeIndex);
+			pathTuples[i] = new Tuple(new byte[f], new byte[n], new byte[l], new byte[a]);
+			pathTuples[i].setF(Arrays.copyOfRange(data, 0, f));
+			pathTuples[i].setN(Arrays.copyOfRange(data, f, f+n));
+			pathTuples[i].setL(Arrays.copyOfRange(data, f+n, f+n+l));
+			pathTuples[i].setA(Arrays.copyOfRange(data, f+n+l, data.length));
+		}
 		byte[] Ni = con2.read();
+		
+		//byte[] test = con2.read();
 		step2.stop();
 
 		step3.start();

+ 20 - 2
test/misc/HelloWorld.java

@@ -4,8 +4,10 @@ import java.math.BigInteger;
 import java.util.ArrayList;
 import java.util.List;
 
+import crypto.Crypto;
 import oram.Forest;
 import oram.Metadata;
+import util.StopWatch;
 import util.Util;
 
 public class HelloWorld {
@@ -33,9 +35,25 @@ public class HelloWorld {
 		 * byte aa = 1; aa ^= 1; System.out.println(aa);
 		 */
 
-		Metadata md = new Metadata();
+		/*Metadata md = new Metadata();
 		Forest forest = Forest.readFromFile(md.getDefaultForestFileName());
-		forest.print();
+		forest.print();*/
+		
+		StopWatch sw1 = new StopWatch();
+		StopWatch sw2 = new StopWatch();
+		byte[] arr1 = Util.nextBytes((int) Math.pow(2, 20), Crypto.sr);
+		byte[] arr2 = Util.nextBytes((int) Math.pow(2, 20), Crypto.sr);
+		
+		sw1.start();
+		Util.xor(arr1, arr2);
+		sw1.stop();
+		
+		sw2.start();
+		new BigInteger(1, arr1).xor(new BigInteger(1, arr2)).toByteArray();
+		sw2.stop();
+		
+		System.out.println(sw1.toMS());
+		System.out.println(sw2.toMS());
 	}
 
 }