Add node and php to benchmark dashboard
diff --git a/benchmarks/Makefile.am b/benchmarks/Makefile.am
index c758ee6..a9c69c7 100644
--- a/benchmarks/Makefile.am
+++ b/benchmarks/Makefile.am
@@ -260,7 +260,7 @@
 	@echo 'all_data=""' >> go-benchmark
 	@echo 'conf=()' >> go-benchmark
 	@echo 'data_files=()' >> go-benchmark
-	@echo 'for arg in $$@; do if [[ $${arg:0:1} == "-" ]]; then conf+=($$arg); else data_files+=("../$$arg"); fi; done' >> go-benchmark
+	@echo 'for arg in $$@; do if [[ $${arg:0:1} == "-" ]]; then conf+=($$arg); else data_files+=("$$arg"); fi; done' >> go-benchmark
 	@echo 'go test -bench=. $${conf[*]} -- $${data_files[*]}' >> go-benchmark
 	@echo 'cd ..' >> go-benchmark
 	@chmod +x go-benchmark
@@ -533,7 +533,6 @@
 	@echo '#! /bin/bash' > php-c-benchmark
 	@echo 'export PROTOBUF_PHP_SRCDIR="$$(cd $(top_srcdir) && pwd)/php/src"' >> php-c-benchmark
 	@echo 'export PROTOBUF_PHP_EXTDIR="$$PROTOBUF_PHP_SRCDIR/../ext/google/protobuf/modules"' >> php-c-benchmark
-	@echo 'echo "$$PROTOBUF_PHP_EXTDIR/protobuf.so"' >> php-c-benchmark
 	@echo 'cd tmp/php' >> php-c-benchmark
 	@echo 'export CURRENT_DIR=$$(pwd)' >> php-c-benchmark
 	@echo 'php -d auto_prepend_file="autoload.php" -d include_path="$$(pwd)" -d extension="$$PROTOBUF_PHP_EXTDIR/protobuf.so" Google/Protobuf/Benchmark/PhpBenchmark.php $$@' >> php-c-benchmark
diff --git a/benchmarks/js/js_benchmark.js b/benchmarks/js/js_benchmark.js
index 14905e3..875be68 100644
--- a/benchmarks/js/js_benchmark.js
+++ b/benchmarks/js/js_benchmark.js
@@ -18,6 +18,7 @@
 }
 
 var results = [];
+var json_file = "";
 
 console.log("#####################################################");
 console.log("Js Benchmark: ");
@@ -25,6 +26,11 @@
   if (index < 2) {
     return;
   }
+  if (filename.indexOf("--json_output") != -1) {
+    json_file = filename.replace(/^--json_output=/, '');
+    return;
+  }
+  
   var benchmarkDataset =
       proto.benchmarks.BenchmarkDataset.deserializeBinary(fs.readFileSync(filename));
   var messageList = [];
@@ -55,8 +61,8 @@
   results.push({
     filename: filename,
     benchmarks: {
-      protobufjs_decoding: senarios.benches[0] * totalBytes,
-      protobufjs_encoding: senarios.benches[1] * totalBytes
+      protobufjs_decoding: senarios.benches[0] * totalBytes / 1024 / 1024,
+      protobufjs_encoding: senarios.benches[1] * totalBytes / 1024 / 1024
     }
   })
 
@@ -68,3 +74,9 @@
 });
 console.log("#####################################################");
 
+if (json_file != "") {
+  fs.writeFile(json_file, JSON.stringify(results), (err) => {
+    if (err) throw err;
+  });
+}
+
diff --git a/benchmarks/php/PhpBenchmark.php b/benchmarks/php/PhpBenchmark.php
index 058940d..9c1132d 100644
--- a/benchmarks/php/PhpBenchmark.php
+++ b/benchmarks/php/PhpBenchmark.php
@@ -93,7 +93,7 @@
     }
 }
 
-function runBenchmark($file) {
+function runBenchmark($file, $behavior_prefix) {
     $datafile = fopen($file, "r") or die("Unable to open file " . $file);
     $bytes = fread($datafile, filesize($file));
     $dataset = new BenchmarkDataset(NULL);
@@ -119,8 +119,8 @@
     return array(
         "filename" => $file,
         "benchmarks" => array(
-            "parse_php" => $parse_benchmark->runBenchmark(),
-            "serailize_php" => $serialize_benchmark->runBenchmark()
+            $behavior_prefix . "_parse" => $parse_benchmark->runBenchmark(),
+            $behavior_prefix . "_serailize" => $serialize_benchmark->runBenchmark()
         ),
         "message_name" => $dataset->getMessageName()
     );
@@ -129,15 +129,27 @@
 // main
 $json_output = false;
 $results = array();
+$behavior_prefix = "";
+
 foreach ($argv as $index => $arg) {
     if ($index == 0) {
         continue;
     }
     if ($arg == "--json") {
         $json_output = true;
+    } else if (strpos($arg, "--behavior_prefix") == 0) {
+        $behavior_prefix = str_replace("--behavior_prefix=", "", $arg);     
+    }
+}
+
+foreach ($argv as $index => $arg) {
+    if ($index == 0) {
+        continue;
+    }
+    if (substr($arg, 0, 2) == "--") {
         continue;
     } else {
-        array_push($results, runBenchmark($arg));
+        array_push($results, runBenchmark($arg, $behavior_prefix));
     }
 }
 
diff --git a/benchmarks/python/py_benchmark.py b/benchmarks/python/py_benchmark.py
index e86b61e..ebb1974 100755
--- a/benchmarks/python/py_benchmark.py
+++ b/benchmarks/python/py_benchmark.py
@@ -44,9 +44,13 @@
   data = open(filename).read()
   benchmark_dataset = benchmarks_pb2.BenchmarkDataset()
   benchmark_dataset.ParseFromString(data)
+  total_bytes = 0
+  for payload in benchmark_dataset.payload:
+    total_bytes += len(payload)
   benchmark_util = Benchmark(full_iteration=len(benchmark_dataset.payload),
                              module="py_benchmark",
-                             setup_method="init")
+                             setup_method="init",
+                             total_bytes=total_bytes)
   result={}
   result["filename"] =  filename
   result["message_name"] =  benchmark_dataset.message_name
@@ -61,10 +65,11 @@
 
 
 def init(filename):
-  global benchmark_dataset, message_class, message_list, counter
+  global benchmark_dataset, message_class, message_list, counter, total_bytes
   message_list=[]
   counter = 0
-  data = open(os.path.dirname(sys.argv[0]) + "/../" + filename).read()
+  total_bytes = 0
+  data = open(filename).read()
   benchmark_dataset = benchmarks_pb2.BenchmarkDataset()
   benchmark_dataset.ParseFromString(data)
 
@@ -85,6 +90,7 @@
     temp = message_class()
     temp.ParseFromString(one_payload)
     message_list.append(temp)
+    total_bytes += len(one_payload)
 
 
 def parse_from_benchmark():
@@ -101,11 +107,12 @@
 
 class Benchmark:
   def __init__(self, module=None, test_method=None,
-               setup_method=None, full_iteration = 1):
+               setup_method=None, total_bytes=None, full_iteration = 1):
     self.full_iteration = full_iteration
     self.module = module
     self.test_method = test_method
     self.setup_method = setup_method
+    self.total_bytes = total_bytes
 
   def set_test_method(self, test_method):
     self.test_method = test_method
@@ -130,7 +137,7 @@
     t = timeit.timeit(stmt="%s(%s)" % (self.test_method, test_method_args),
                       setup=self.full_setup_code(setup_method_args),
                       number=reps);
-    return 1.0 * t / reps * (10 ** 9)
+    return self.total_bytes * 1.0 / 2 ** 20 / (1.0 * t / reps)
   
 
 if __name__ == "__main__":
@@ -144,10 +151,10 @@
     for result in results:
       print("Message %s of dataset file %s" % \
           (result["message_name"], result["filename"]))
-      print("Average time for parse_from_benchmark: %.2f ns" % \
+      print("Average throughput for parse_from_benchmark: %.2f MB/s" % \
           (result["benchmarks"][ \
                       args.behavior_prefix + "_parse_from_benchmark"]))
-      print("Average time for serialize_to_benchmark: %.2f ns" % \
+      print("Average throughput for serialize_to_benchmark: %.2f MB/s" % \
           (result["benchmarks"][ \
                       args.behavior_prefix + "_serialize_to_benchmark"]))
       print("")
diff --git a/benchmarks/util/result_parser.py b/benchmarks/util/result_parser.py
index 32f35a9..0b8fc49 100755
--- a/benchmarks/util/result_parser.py
+++ b/benchmarks/util/result_parser.py
@@ -115,7 +115,6 @@
 #         behavior: results,
 #         ...
 #       },
-#       "message_name": STRING
 #     },
 #     ...
 #   ], #pure-python
@@ -136,8 +135,7 @@
             "language": "python",
             "dataFilename": __extract_file_name(result["filename"]),
             "behavior": behavior,
-            "throughput": avg_size /
-                          result["benchmarks"][behavior] * 1e9 / 2 ** 20
+            "throughput": result["benchmarks"][behavior]
           })
 
 
@@ -220,7 +218,7 @@
         continue
       first_slash_index = result_list[0].find('/')
       last_slash_index = result_list[0].rfind('/')
-      full_filename = result_list[0][first_slash_index+4:last_slash_index] # delete ../ prefix
+      full_filename = result_list[0][first_slash_index+1:last_slash_index]
       total_bytes, _ = __get_data_size(full_filename)
       behavior_with_suffix = result_list[0][last_slash_index+1:]
       last_dash = behavior_with_suffix.rfind("-")
@@ -236,11 +234,45 @@
       })
 
 
+# Node/Php results example:
+#
+# [
+#   {
+#     "filename": string,
+#     "benchmarks": {
+#       behavior: results,
+#       ...
+#     },
+#   },
+#   ...
+# ]
+def __parse_js_php_result(filename, language):
+  if filename == "":
+    return
+  if filename[0] != '/':
+    filename = os.path.dirname(os.path.abspath(__file__)) + '/' + filename
+  with open(filename) as f:
+    results = json.loads(f.read())
+    for result in results:
+      _, avg_size = __get_data_size(result["filename"])
+      for behavior in result["benchmarks"]:
+        __results.append({
+          "language": language,
+          "dataFilename": __extract_file_name(result["filename"]),
+          "behavior": behavior,
+          "throughput": result["benchmarks"][behavior]
+        })
+
+
+
 def get_result_from_file(cpp_file="",
                          java_file="",
                          python_file="",
                          go_file="",
-                         synthetic_file=""):
+                         synthetic_file="",
+                         node_file="",
+                         php_c_file="",
+                         php_file=""):
   results = {}
   if cpp_file != "":
     __parse_cpp_result(cpp_file)
@@ -252,5 +284,11 @@
     __parse_go_result(go_file)
   if synthetic_file != "":
     __parse_synthetic_result(synthetic_file)
+  if node_file != "":
+    __parse_js_php_result(node_file, "node")
+  if php_file != "":
+    __parse_js_php_result(php_file, "php")
+  if php_c_file != "":
+    __parse_js_php_result(php_c_file, "php")        
 
   return __results
diff --git a/benchmarks/util/result_uploader.py b/benchmarks/util/result_uploader.py
index a667da0..9167caf 100755
--- a/benchmarks/util/result_uploader.py
+++ b/benchmarks/util/result_uploader.py
@@ -59,13 +59,14 @@
       labels_string += ",|%s:%s|" % (key, result[key])
     new_result["labels"] = labels_string[1:]
     new_result["timestamp"] = _INITIAL_TIME
-
-    bq = big_query_utils.create_big_query()
-    row = big_query_utils.make_row(str(uuid.uuid4()), new_result)
-    if not big_query_utils.insert_rows(bq, _PROJECT_ID, _DATASET,
-                                       _TABLE + "$" + _NOW,
-                                       [row]):
-      print('Error when uploading result', new_result)
+    print(labels_string)
+# 
+#     bq = big_query_utils.create_big_query()
+#     row = big_query_utils.make_row(str(uuid.uuid4()), new_result)
+#     if not big_query_utils.insert_rows(bq, _PROJECT_ID, _DATASET,
+#                                        _TABLE + "$" + _NOW,
+#                                        [row]):
+#       print('Error when uploading result', new_result)
 
 
 if __name__ == "__main__":
@@ -82,6 +83,15 @@
   parser.add_argument("-go", "--go_input_file",
                       help="The golang benchmark result file's name",
                       default="")
+  parser.add_argument("-node", "--node_input_file",
+                      help="The node.js benchmark result file's name",
+                      default="")
+  parser.add_argument("-php", "--php_input_file",
+                      help="The pure php benchmark result file's name",
+                      default="")
+  parser.add_argument("-php_c", "--php_c_input_file",
+                      help="The php with c ext benchmark result file's name",
+                      default="")    
   args = parser.parse_args()
 
   metadata = get_metadata()
@@ -90,5 +100,8 @@
       cpp_file=args.cpp_input_file,
       java_file=args.java_input_file,
       python_file=args.python_input_file,
-      go_file=args.go_input_file
+      go_file=args.go_input_file,
+      node_file=args.node_input_file,
+      php_file=args.php_input_file,
+      php_c_file=args.php_c_input_file,
   ), metadata)
\ No newline at end of file