You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@impala.apache.org by ta...@apache.org on 2016/07/08 09:42:01 UTC

[1/2] incubator-impala git commit: Move all benchmarks to benchmark/ folder

Repository: incubator-impala
Updated Branches:
  refs/heads/master c7b7c3ece -> 667a778af


http://git-wip-us.apache.org/repos/asf/incubator-impala/blob/667a778a/be/src/exprs/in-predicate-benchmark.cc
----------------------------------------------------------------------
diff --git a/be/src/exprs/in-predicate-benchmark.cc b/be/src/exprs/in-predicate-benchmark.cc
deleted file mode 100644
index f337e1e..0000000
--- a/be/src/exprs/in-predicate-benchmark.cc
+++ /dev/null
@@ -1,332 +0,0 @@
-// Copyright 2015 Cloudera Inc.
-//
-// 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.
-
-
-// Note: The results do not include the pre-processing in the prepare function that is
-// necessary for SetLookup but not Iterate. None of the values searched for are in the
-// fabricated IN list (i.e. hit rate is 0).
-
-// Machine Info: Intel(R) Core(TM) i7-2600 CPU @ 3.40GHz
-// int n=1:              Function     Rate (iters/ms)          Comparison
-// ----------------------------------------------------------------------
-//                  SetLookup n=1               902.4                  1X
-//                    Iterate n=1               938.3               1.04X
-
-// int n=2:              Function     Rate (iters/ms)          Comparison
-// ----------------------------------------------------------------------
-//                  SetLookup n=2               888.6                  1X
-//                    Iterate n=2               805.6             0.9066X
-
-// int n=3:              Function     Rate (iters/ms)          Comparison
-// ----------------------------------------------------------------------
-//                  SetLookup n=3               806.5                  1X
-//                    Iterate n=3               744.1             0.9227X
-
-// int n=4:              Function     Rate (iters/ms)          Comparison
-// ----------------------------------------------------------------------
-//                  SetLookup n=4               784.1                  1X
-//                    Iterate n=4                 661              0.843X
-
-// int n=5:              Function     Rate (iters/ms)          Comparison
-// ----------------------------------------------------------------------
-//                  SetLookup n=5               801.6                  1X
-//                    Iterate n=5               594.4             0.7415X
-
-// int n=6:              Function     Rate (iters/ms)          Comparison
-// ----------------------------------------------------------------------
-//                  SetLookup n=6               746.6                  1X
-//                    Iterate n=6                 539              0.722X
-
-// int n=7:              Function     Rate (iters/ms)          Comparison
-// ----------------------------------------------------------------------
-//                  SetLookup n=7               683.4                  1X
-//                    Iterate n=7               493.9             0.7226X
-
-// int n=8:              Function     Rate (iters/ms)          Comparison
-// ----------------------------------------------------------------------
-//                  SetLookup n=8                 772                  1X
-//                    Iterate n=8               455.5               0.59X
-
-// int n=9:              Function     Rate (iters/ms)          Comparison
-// ----------------------------------------------------------------------
-//                  SetLookup n=9               702.9                  1X
-//                    Iterate n=9               420.1             0.5976X
-
-// int n=10:             Function     Rate (iters/ms)          Comparison
-// ----------------------------------------------------------------------
-//                 SetLookup n=10               710.7                  1X
-//                   Iterate n=10               392.4             0.5521X
-
-// int n=400:            Function     Rate (iters/ms)          Comparison
-// ----------------------------------------------------------------------
-//                SetLookup n=400               422.3                  1X
-//                  Iterate n=400               14.01            0.03318X
-
-
-// string n=1:           Function     Rate (iters/ms)          Comparison
-// ----------------------------------------------------------------------
-//                  SetLookup n=1               250.8                  1X
-//                    Iterate n=1               540.4              2.154X
-
-// string n=2:           Function     Rate (iters/ms)          Comparison
-// ----------------------------------------------------------------------
-//                  SetLookup n=2                 205                  1X
-//                    Iterate n=2               297.7              1.453X
-
-// string n=3:           Function     Rate (iters/ms)          Comparison
-// ----------------------------------------------------------------------
-//                  SetLookup n=3               166.8                  1X
-//                    Iterate n=3               240.3              1.441X
-
-// string n=4:           Function     Rate (iters/ms)          Comparison
-// ----------------------------------------------------------------------
-//                  SetLookup n=4               146.2                  1X
-//                    Iterate n=4               177.8              1.216X
-
-// string n=5:           Function     Rate (iters/ms)          Comparison
-// ----------------------------------------------------------------------
-//                  SetLookup n=5               149.9                  1X
-//                    Iterate n=5               144.8             0.9662X
-
-// string n=6:           Function     Rate (iters/ms)          Comparison
-// ----------------------------------------------------------------------
-//                  SetLookup n=6               135.9                  1X
-//                    Iterate n=6               127.4             0.9372X
-
-// string n=7:           Function     Rate (iters/ms)          Comparison
-// ----------------------------------------------------------------------
-//                  SetLookup n=7               143.4                  1X
-//                    Iterate n=7               112.8             0.7866X
-
-// string n=8:           Function     Rate (iters/ms)          Comparison
-// ----------------------------------------------------------------------
-//                  SetLookup n=8               123.7                  1X
-//                    Iterate n=8               117.1             0.9467X
-
-// string n=9:           Function     Rate (iters/ms)          Comparison
-// ----------------------------------------------------------------------
-//                  SetLookup n=9                 117                  1X
-//                    Iterate n=9               89.19              0.762X
-
-// string n=10:          Function     Rate (iters/ms)          Comparison
-// ----------------------------------------------------------------------
-//                 SetLookup n=10               125.4                  1X
-//                   Iterate n=10               81.63             0.6508X
-
-// string n=400:         Function     Rate (iters/ms)          Comparison
-// ----------------------------------------------------------------------
-//                SetLookup n=400               55.77                  1X
-//                  Iterate n=400               1.936            0.03471X
-
-// decimal(4,0) n=1:     Function     Rate (iters/ms)          Comparison
-// ----------------------------------------------------------------------
-//                  SetLookup n=1               587.9                  1X
-//                    Iterate n=1               658.3               1.12X
-
-// decimal(4,0) n=2:     Function     Rate (iters/ms)          Comparison
-// ----------------------------------------------------------------------
-//                  SetLookup n=2               521.5                  1X
-//                    Iterate n=2               478.5             0.9175X
-
-// decimal(4,0) n=3:     Function     Rate (iters/ms)          Comparison
-// ----------------------------------------------------------------------
-//                  SetLookup n=3                 524                  1X
-//                    Iterate n=3               373.7             0.7132X
-
-// decimal(4,0) n=4:     Function     Rate (iters/ms)          Comparison
-// ----------------------------------------------------------------------
-//                  SetLookup n=4               486.6                  1X
-//                    Iterate n=4               308.9             0.6348X
-
-// decimal(4,0) n=400:   Function     Rate (iters/ms)          Comparison
-// ----------------------------------------------------------------------
-//                SetLookup n=400               258.2                  1X
-//                  Iterate n=400               4.272            0.01655X
-
-#include <boost/lexical_cast.hpp>
-#include <gutil/strings/substitute.h>
-
-#include "exprs/in-predicate.h"
-#include "exprs/in-predicate-ir.cc"
-
-#include "udf/udf-test-harness.h"
-#include "util/benchmark.h"
-#include "util/cpu-info.h"
-
-#include "common/names.h"
-
-using namespace impala;
-using namespace impala_udf;
-using namespace strings;
-
-namespace impala {
-
-template<typename T> T MakeAnyVal(int v) {
-  return T(v);
-}
-
-template<> StringVal MakeAnyVal(int v) {
-  // Leak these strings so we don't have to worry about them going out of scope
-  string* s = new string();
-  *s = lexical_cast<string>(v);
-  return StringVal(reinterpret_cast<uint8_t*>(const_cast<char*>(s->c_str())), s->size());
-}
-
-class InPredicateBenchmark {
- public:
-  template<typename T, typename SetType>
-  struct TestData {
-    vector<T> anyvals;
-    vector<AnyVal*> anyval_ptrs;
-    InPredicate::SetLookupState<SetType> state;
-
-    vector<T> search_vals;
-
-    int total_found_set;
-    int total_set;
-    int total_found_iter;
-    int total_iter;
-  };
-
-  template<typename T, typename SetType>
-  static TestData<T, SetType> CreateTestData(int num_values,
-      const FunctionContext::TypeDesc& type, int num_search_vals = 100) {
-    srand(time(NULL));
-    TestData<T, SetType> data;
-    data.anyvals.resize(num_values);
-    data.anyval_ptrs.resize(num_values);
-    for (int i = 0; i < num_values; ++i) {
-      data.anyvals[i] = MakeAnyVal<T>(rand());
-      data.anyval_ptrs[i] = &data.anyvals[i];
-    }
-
-    for (int i = 0; i < num_search_vals; ++i) {
-      data.search_vals.push_back(MakeAnyVal<T>(rand()));
-    }
-
-    FunctionContext* ctx = CreateContext(num_values, type);
-
-    vector<AnyVal*> constant_args;
-    constant_args.push_back(NULL);
-    for (AnyVal* p: data.anyval_ptrs) constant_args.push_back(p);
-    UdfTestHarness::SetConstantArgs(ctx, constant_args);
-
-    InPredicate::SetLookupPrepare<T, SetType>(ctx, FunctionContext::FRAGMENT_LOCAL);
-    data.state = *reinterpret_cast<InPredicate::SetLookupState<SetType>*>(
-        ctx->GetFunctionState(FunctionContext::FRAGMENT_LOCAL));
-
-    data.total_found_set = data.total_set = data.total_found_iter = data.total_iter = 0;
-    return data;
-  }
-
-  template<typename T, typename SetType>
-  static void TestSetLookup(int batch_size, void* d) {
-    TestData<T, SetType>* data = reinterpret_cast<TestData<T, SetType>*>(d);
-    for (int i = 0; i < batch_size; ++i) {
-      for (const T& search_val: data->search_vals) {
-        BooleanVal found = InPredicate::SetLookup(&data->state, search_val);
-        if (found.val) ++data->total_found_set;
-        ++data->total_set;
-      }
-    }
-  }
-
-  template<typename T, typename SetType>
-  static void TestIterate(int batch_size, void* d) {
-    TestData<T, SetType>* data = reinterpret_cast<TestData<T, SetType>*>(d);
-    for (int i = 0; i < batch_size; ++i) {
-      for (const T& search_val: data->search_vals) {
-        BooleanVal found = InPredicate::Iterate(
-            data->state.type, search_val, data->anyvals.size(), &data->anyvals[0]);
-        if (found.val) ++data->total_found_iter;
-        ++data->total_iter;
-      }
-    }
-  }
-
-  static void RunIntBenchmark(int n) {
-    Benchmark suite(Substitute("int n=$0", n));
-    FunctionContext::TypeDesc type;
-    type.type = FunctionContext::TYPE_INT;
-    TestData<IntVal, int32_t> data =
-        InPredicateBenchmark::CreateTestData<IntVal, int32_t>(n, type);
-    suite.AddBenchmark(Substitute("SetLookup n=$0", n),
-                       InPredicateBenchmark::TestSetLookup<IntVal, int32_t>, &data);
-    suite.AddBenchmark(Substitute("Iterate n=$0", n),
-                       InPredicateBenchmark::TestIterate<IntVal, int32_t>, &data);
-    cout << suite.Measure() << endl;
-    // cout << "Found set: " << (double)data.total_found_set / data.total_set << endl;
-    // cout << "Found iter: " << (double)data.total_found_iter / data.total_iter << endl;
-  }
-
-  static void RunStringBenchmark(int n) {
-    Benchmark suite(Substitute("string n=$0", n));
-    FunctionContext::TypeDesc type;
-    type.type = FunctionContext::TYPE_STRING;
-    TestData<StringVal, StringValue> data =
-        InPredicateBenchmark::CreateTestData<StringVal, StringValue>(n, type);
-    suite.AddBenchmark(Substitute("SetLookup n=$0", n),
-                       InPredicateBenchmark::TestSetLookup<StringVal, StringValue>, &data);
-    suite.AddBenchmark(Substitute("Iterate n=$0", n),
-                       InPredicateBenchmark::TestIterate<StringVal, StringValue>, &data);
-    cout << suite.Measure() << endl;
-    // cout << "Found set: " << (double)data.total_found_set / data.total_set << endl;
-    // cout << "Found iter: " << (double)data.total_found_iter / data.total_iter << endl;
-  }
-
-  static void RunDecimalBenchmark(int n) {
-    Benchmark suite(Substitute("decimal(4,0) n=$0", n));
-    FunctionContext::TypeDesc type;
-    type.type = FunctionContext::TYPE_DECIMAL;
-    type.precision = 4;
-    type.scale = 0;
-    TestData<DecimalVal, Decimal16Value> data =
-        InPredicateBenchmark::CreateTestData<DecimalVal, Decimal16Value>(n, type);
-    suite.AddBenchmark(Substitute("SetLookup n=$0", n),
-                       InPredicateBenchmark::TestSetLookup<DecimalVal, Decimal16Value>, &data);
-    suite.AddBenchmark(Substitute("Iterate n=$0", n),
-                       InPredicateBenchmark::TestIterate<DecimalVal, Decimal16Value>, &data);
-    cout << suite.Measure() << endl;
-  }
-
- private:
-  static FunctionContext* CreateContext(
-      int num_args, const FunctionContext::TypeDesc& type) {
-    // Types don't matter (but number of args do)
-    FunctionContext::TypeDesc ret_type;
-    vector<FunctionContext::TypeDesc> arg_types(num_args + 1, type);
-    return UdfTestHarness::CreateTestContext(ret_type, arg_types);
-  }
-
-};
-
-}
-
-int main(int argc, char **argv) {
-  CpuInfo::Init();
-  cout << Benchmark::GetMachineInfo() << endl;
-
-  for (int i = 1; i <= 10; ++i) InPredicateBenchmark::RunIntBenchmark(i);
-  InPredicateBenchmark::RunIntBenchmark(400);
-
-  cout << endl;
-
-  for (int i = 1; i <= 10; ++i) InPredicateBenchmark::RunStringBenchmark(i);
-  InPredicateBenchmark::RunStringBenchmark(400);
-
-  for (int i = 1; i <= 4; ++i) InPredicateBenchmark::RunDecimalBenchmark(i);
-  InPredicateBenchmark::RunDecimalBenchmark(400);
-
-  return 0;
-}

http://git-wip-us.apache.org/repos/asf/incubator-impala/blob/667a778a/be/src/util/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/be/src/util/CMakeLists.txt b/be/src/util/CMakeLists.txt
index ed1fdfd..57bf572 100644
--- a/be/src/util/CMakeLists.txt
+++ b/be/src/util/CMakeLists.txt
@@ -99,10 +99,8 @@ add_library(loggingsupport SHARED
 
 target_link_libraries(Webserver pthread dl Util ${OPENSSL_LIBS})
 
-add_executable(network-perf-benchmark network-perf-benchmark.cc)
 add_executable(parquet-reader parquet-reader.cc)
 
-target_link_libraries(network-perf-benchmark ${IMPALA_LINK_LIBS})
 target_link_libraries(parquet-reader ${IMPALA_LINK_LIBS})
 
 target_link_libraries(loggingsupport ${IMPALA_LINK_LIBS_DYNAMIC_TARGETS})

http://git-wip-us.apache.org/repos/asf/incubator-impala/blob/667a778a/be/src/util/network-perf-benchmark.cc
----------------------------------------------------------------------
diff --git a/be/src/util/network-perf-benchmark.cc b/be/src/util/network-perf-benchmark.cc
deleted file mode 100644
index b218c97..0000000
--- a/be/src/util/network-perf-benchmark.cc
+++ /dev/null
@@ -1,243 +0,0 @@
-// Copyright 2012 Cloudera Inc.
-//
-// 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.
-
-#include <iostream>
-
-#include <thrift/protocol/TBinaryProtocol.h>
-#include <thrift/protocol/TDebugProtocol.h>
-#include <thrift/transport/TSocket.h>
-#include <thrift/transport/TTransportUtils.h>
-
-#include <boost/algorithm/string.hpp>
-#include <boost/thread/thread.hpp>
-#include "gen-cpp/NetworkTest_types.h"
-#include "gen-cpp/NetworkTestService.h"
-
-#include "common/logging.h"
-#include "util/cpu-info.h"
-#include "util/stopwatch.h"
-#include "rpc/thrift-client.h"
-#include "rpc/thrift-server.h"
-#include "rpc/thrift-thread.h"
-
-#include "common/names.h"
-
-DEFINE_int32(port, 22222, "Port for NetworkTestService");
-DEFINE_int64(send_batch_size, 0, "Batch size (in bytes).  Data is split up into batches");
-
-// Simple client server network speed benchmark utility.  This compiles to
-// a binary that runs as both the client and server.  The server can be started
-// up by just running the binary.  After the server starts up, it will drop into
-// the client 'shell' where benchmarks can be run.
-// The supported benchmarks are:
-//   'send <size in mb> <target ip>'
-//   'broadcast <size in mb> <list of space separated target ips>
-// The command can also be passed in via command line in the same format.  If
-// run in this mode, the server does not start up.
-// For broadcast, the data is sent in parallel to all nodes.
-//
-// The expected usage for measuring 'send' is to start up the server on one machine
-// and issue the send from another.
-// For 'broadcast', the server should be started on all the machines and then the
-// broadcast is issued from one of them.
-
-using boost::algorithm::is_any_of;
-using boost::algorithm::token_compress_on;
-using boost::algorithm::split;
-
-using namespace apache::thrift;
-using namespace apache::thrift::protocol;
-using namespace apache::thrift::transport;
-using namespace apache::thrift::server;
-using namespace apache::thrift::concurrency;
-using namespace impala;
-using namespace impalatest;
-
-
-class TestServer : public NetworkTestServiceIf {
- public:
-  TestServer() {
-  }
-
-  virtual ~TestServer() {
-  }
-
-  virtual void Send(ThriftDataResult& result, const ThriftDataParams& params) {
-    result.__set_bytes_received(params.data.size());
-  }
-
-  void Server(ThriftServer* server) {
-    server->Start();
-    server->Join();
-  }
-};
-
-// Send bytes to client respecting the batch size
-// Returns the rate in mb/s to send the data.
-double Send(ThriftClient<NetworkTestServiceClient>* client, int64_t bytes) {
-  int64_t batch_size = FLAGS_send_batch_size;
-  if (batch_size == 0) batch_size = bytes;
-  int64_t total_sent = 0;
-
-  MonotonicStopWatch timer;
-  timer.Start();
-  while (total_sent < bytes) {
-    int64_t send_size = min(bytes - total_sent, batch_size);
-    total_sent += send_size;
-
-    ThriftDataParams data;
-    ThriftDataResult result;
-    data.data.resize(send_size);
-    client->iface()->Send(result, data);
-
-    if (result.bytes_received != send_size) {
-      return -1;
-    }
-  }
-  timer.Stop();
-
-  double mb = bytes / (1024. * 1024.);
-  double sec = timer.ElapsedTime() / (1000.) / (1000.) / (1000.);
-  return mb/sec;
-}
-
-// Send tokens[1] megabytes to tokens[2]
-void HandleSend(const vector<string>& tokens) {
-  if (tokens.size() != 3) {
-    return;
-  }
-
-  int64_t mbs = atoi(tokens[1].c_str());
-  int64_t bytes = mbs * (1024L * 1024L);
-  cout << "Sending " << mbs << " megabytes..." << endl;
-  const string& ip = tokens[2];
-
-  ThriftClient<NetworkTestServiceClient> client(ip, FLAGS_port);
-  Status status = client.Open();
-  if (!status.ok()) {
-    cerr << "Could not connect to server" << endl;
-    return;
-  }
-
-  double rate = Send(&client, bytes);
-  if (rate < 0) {
-    cerr << "Send failed";
-    return;
-  }
-  cout << "Send rate: (MB/s): " << rate << endl;
-}
-
-// Broadcast tokens[1] megabytes to tokens[2...n] nodes in parallel.
-void HandleBroadcast(const vector<string>& tokens) {
-  if (tokens.size() <= 2) {
-    return;
-  }
-  int64_t mbs = atoi(tokens[1].c_str());
-  int64_t bytes = mbs * (1024L * 1024L);
-  cout << "Broadcasting " << mbs << " megabytes..." << endl;
-
-  vector<ThriftClient<NetworkTestServiceClient>* > clients;
-  for (int i = 2; i < tokens.size(); ++i) {
-    ThriftClient<NetworkTestServiceClient>* client =
-        new ThriftClient<NetworkTestServiceClient>(tokens[i], FLAGS_port);
-    Status status = client->Open();
-    if (!status.ok()) {
-      cerr << "Could not connect to server: " << tokens[i] << endl;
-      return;
-    }
-    clients.push_back(client);
-  }
-
-  MonotonicStopWatch timer;
-  timer.Start();
-  thread_group threads;
-  for (int i = 0; i < clients.size(); ++i) {
-    threads.add_thread(new thread(Send, clients[i], bytes));
-  }
-  threads.join_all();
-  timer.Stop();
-
-  double mb = bytes / (1024 * 1024.);
-  double sec = timer.ElapsedTime() / (1000.) / (1000.) / (1000.);
-
-  cout << "Send rate per node: (MB/s) " << (mb/sec) << endl;
-  cout << "Send rate cluster: (MB/s) " << (mb * clients.size() / sec) << endl;
-}
-
-void ConvertToLowerCase(vector<string>* tokens) {
-  for (int i = 0; i < tokens->size(); ++i) {
-    transform(
-        (*tokens)[i].begin(), (*tokens)[i].end(), (*tokens)[i].begin(), ::tolower);
-  }
-}
-
-bool ProcessCommand(const vector<string>& tokens) {
-  if (tokens.empty()) return false;
-
-  if (tokens[0] == "quit") return true;;
-
-  if (tokens[0] == "send") {
-    HandleSend(tokens);
-  } else if (tokens[0] == "broadcast") {
-    HandleBroadcast(tokens);
-  } else {
-    cerr << "Invalid command" << endl;
-    return false;
-  }
-  return false;
-}
-
-int main(int argc, char** argv) {
-  google::ParseCommandLineFlags(&argc, &argv, true);
-  CpuInfo::Init();
-
-  if (argc != 1) {
-    // Just run client from command line args
-    vector<string> tokens;
-    for (int i = 1; i < argc; ++i) {
-      tokens.push_back(argv[i]);
-    }
-    ConvertToLowerCase(&tokens);
-    ProcessCommand(tokens);
-    return 0;
-  }
-
-  // Start up server and client shell
-  shared_ptr<TestServer> handler(new TestServer);
-  shared_ptr<ThreadFactory> thread_factory(new ThriftThreadFactory("test", "test"));
-  shared_ptr<TProcessor> processor(new NetworkTestServiceProcessor(handler));
-  ThriftServer* server = new ThriftServer("Network Test Server", processor,
-      FLAGS_port, NULL, NULL, 100, ThriftServer::ThreadPool);
-  thread* server_thread = new thread(&TestServer::Server, handler.get(), server);
-
-  string input;
-  while (1) {
-    vector<string> tokens;
-    cout << "> ";
-    cout.flush();
-
-    getline(cin, input);
-    if (cin.eof()) break;
-
-    split(tokens, input, is_any_of(" "), token_compress_on);
-
-    ConvertToLowerCase(&tokens);
-    if (ProcessCommand(tokens)) break;
-  }
-
-  server->StopForTesting();
-  server_thread->join();
-
-  return 0;
-}


[2/2] incubator-impala git commit: Move all benchmarks to benchmark/ folder

Posted by ta...@apache.org.
Move all benchmarks to benchmark/ folder

This is just a cleanup patch. The immediate motivation is to exclude
them from code coverage reports.

Change-Id: I16d706a4f3f9f1c75f3047fca570d9fc86a46dc9
Reviewed-on: http://gerrit.cloudera.org:8080/3589
Reviewed-by: Michael Ho <kw...@cloudera.com>
Reviewed-by: Dan Hecht <dh...@cloudera.com>
Tested-by: Internal Jenkins


Project: http://git-wip-us.apache.org/repos/asf/incubator-impala/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-impala/commit/667a778a
Tree: http://git-wip-us.apache.org/repos/asf/incubator-impala/tree/667a778a
Diff: http://git-wip-us.apache.org/repos/asf/incubator-impala/diff/667a778a

Branch: refs/heads/master
Commit: 667a778af134ac987a151055388a41bb8e208dc7
Parents: c7b7c3e
Author: Tim Armstrong <ta...@cloudera.com>
Authored: Tue May 31 16:58:18 2016 -0700
Committer: Tim Armstrong <ta...@cloudera.com>
Committed: Fri Jul 8 02:41:53 2016 -0700

----------------------------------------------------------------------
 be/CMakeLists.txt                           |   5 -
 be/src/benchmarks/CMakeLists.txt            |  12 +-
 be/src/benchmarks/expr-benchmark.cc         | 527 +++++++++++++++++++++++
 be/src/benchmarks/in-predicate-benchmark.cc | 332 ++++++++++++++
 be/src/benchmarks/network-perf-benchmark.cc | 243 +++++++++++
 be/src/exprs/CMakeLists.txt                 |   5 -
 be/src/exprs/expr-benchmark.cc              | 527 -----------------------
 be/src/exprs/in-predicate-benchmark.cc      | 332 --------------
 be/src/util/CMakeLists.txt                  |   2 -
 be/src/util/network-perf-benchmark.cc       | 243 -----------
 10 files changed, 1112 insertions(+), 1116 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-impala/blob/667a778a/be/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/be/CMakeLists.txt b/be/CMakeLists.txt
index 3f0374b..5f5a72f 100644
--- a/be/CMakeLists.txt
+++ b/be/CMakeLists.txt
@@ -390,11 +390,6 @@ FUNCTION(ADD_UDF_TEST TEST_NAME)
   ADD_DEPENDENCIES(be-test ${TEST_NAME})
 ENDFUNCTION()
 
-FUNCTION(ADD_BE_BENCHMARK BENCHMARK_NAME)
-  ADD_EXECUTABLE(${BENCHMARK_NAME} ${BENCHMARK_NAME}.cc)
-  TARGET_LINK_LIBRARIES(${BENCHMARK_NAME} ${IMPALA_LINK_LIBS})
-ENDFUNCTION()
-
 # Function to generate rule to cross compile a source file to an IR module.
 # This should be called with the .cc src file and it will generate a
 # src-file-ir target that can be built.

http://git-wip-us.apache.org/repos/asf/incubator-impala/blob/667a778a/be/src/benchmarks/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/be/src/benchmarks/CMakeLists.txt b/be/src/benchmarks/CMakeLists.txt
index 248b884..81ae18e 100644
--- a/be/src/benchmarks/CMakeLists.txt
+++ b/be/src/benchmarks/CMakeLists.txt
@@ -19,6 +19,11 @@ set(LIBRARY_OUTPUT_PATH "${BUILD_OUTPUT_ROOT_DIRECTORY}/benchmarks")
 # where to put generated binaries
 set(EXECUTABLE_OUTPUT_PATH "${BUILD_OUTPUT_ROOT_DIRECTORY}/benchmarks")
 
+FUNCTION(ADD_BE_BENCHMARK BENCHMARK_NAME)
+  ADD_EXECUTABLE(${BENCHMARK_NAME} ${BENCHMARK_NAME}.cc)
+  TARGET_LINK_LIBRARIES(${BENCHMARK_NAME} ${IMPALA_LINK_LIBS})
+ENDFUNCTION()
+
 ADD_BE_BENCHMARK(parse-timestamp-benchmark)
 ADD_BE_BENCHMARK(string-search-benchmark)
 ADD_BE_BENCHMARK(atod-benchmark)
@@ -37,6 +42,9 @@ ADD_BE_BENCHMARK(overflow-benchmark)
 ADD_BE_BENCHMARK(bloom-filter-benchmark)
 ADD_BE_BENCHMARK(int-hash-benchmark)
 ADD_BE_BENCHMARK(bitmap-benchmark)
+ADD_BE_BENCHMARK(expr-benchmark)
+ADD_BE_BENCHMARK(hash-benchmark)
+ADD_BE_BENCHMARK(in-predicate-benchmark)
+ADD_BE_BENCHMARK(network-perf-benchmark)
 
-add_executable(hash-benchmark hash-benchmark.cc)
-target_link_libraries(hash-benchmark Experiments ${IMPALA_LINK_LIBS})
+target_link_libraries(hash-benchmark Experiments)

http://git-wip-us.apache.org/repos/asf/incubator-impala/blob/667a778a/be/src/benchmarks/expr-benchmark.cc
----------------------------------------------------------------------
diff --git a/be/src/benchmarks/expr-benchmark.cc b/be/src/benchmarks/expr-benchmark.cc
new file mode 100644
index 0000000..91f89b5
--- /dev/null
+++ b/be/src/benchmarks/expr-benchmark.cc
@@ -0,0 +1,527 @@
+#include <stdio.h>
+#include <iostream>
+
+#include <jni.h>
+#include <thrift/Thrift.h>
+#include <thrift/protocol/TDebugProtocol.h>
+
+#include "exprs/expr.h"
+#include "exprs/expr-context.h"
+#include "util/benchmark.h"
+#include "util/cpu-info.h"
+#include "util/debug-util.h"
+#include "rpc/jni-thrift-util.h"
+
+#include "gen-cpp/Types_types.h"
+#include "gen-cpp/ImpalaService.h"
+#include "gen-cpp/DataSinks_types.h"
+#include "gen-cpp/Types_types.h"
+#include "gen-cpp/ImpalaService.h"
+#include "gen-cpp/ImpalaService_types.h"
+#include "gen-cpp/ImpalaInternalService.h"
+#include "gen-cpp/Frontend_types.h"
+#include "gen-cpp/ImpalaService.h"
+#include "gen-cpp/ImpalaInternalService.h"
+#include "gen-cpp/Frontend_types.h"
+#include "rpc/thrift-server.h"
+#include "common/object-pool.h"
+#include "common/status.h"
+#include "runtime/mem-tracker.h"
+#include "service/impala-server.h"
+
+#include "common/names.h"
+
+using namespace apache::thrift;
+using namespace impala;
+
+// Utility class to take (ascii) sql and return the plan.  This does minimal
+// error handling.
+class Planner {
+ public:
+  Planner() {
+    JNIEnv* jni_env = getJNIEnv();
+    // create instance of java class JniFrontend
+    jclass fe_class = jni_env->FindClass("com/cloudera/impala/service/JniFrontend");
+    jmethodID fe_ctor = jni_env->GetMethodID(fe_class, "<init>", "(Z)V");
+    EXIT_IF_EXC(jni_env);
+    create_exec_request_id_ =
+        jni_env->GetMethodID(fe_class, "createExecRequest", "([B)[B");
+    EXIT_IF_EXC(jni_env);
+
+    jboolean lazy = true;
+    jobject fe = jni_env->NewObject(fe_class, fe_ctor, lazy);
+    EXIT_IF_EXC(jni_env);
+    ABORT_IF_ERROR(JniUtil::LocalToGlobalRef(jni_env, fe, &fe_));
+  }
+
+  Status GeneratePlan(const string& stmt, TExecRequest* result) {
+    TQueryCtx query_ctx;
+    query_ctx.request.stmt = stmt;
+    query_ctx.request.query_options = query_options_;
+    query_ctx.__set_session(session_state_);
+    ImpalaServer::PrepareQueryContext(&query_ctx);
+
+    JNIEnv* jni_env = getJNIEnv();
+    JniLocalFrame jni_frame;
+    RETURN_IF_ERROR(jni_frame.push(jni_env));
+    jbyteArray request_bytes;
+    RETURN_IF_ERROR(SerializeThriftMsg(jni_env, &query_ctx, &request_bytes));
+    jbyteArray result_bytes = static_cast<jbyteArray>(
+        jni_env->CallObjectMethod(fe_, create_exec_request_id_, request_bytes));
+    RETURN_ERROR_IF_EXC(jni_env);
+    RETURN_IF_ERROR(DeserializeThriftMsg(jni_env, result_bytes, result));
+    return Status::OK();
+  }
+
+ private:
+  jobject fe_;  // instance of com.cloudera.impala.service.JniFrontend
+  jmethodID create_exec_request_id_;  // JniFrontend.createExecRequest()
+
+  TQueryOptions query_options_;
+  TSessionState session_state_;
+};
+
+struct TestData {
+  ExprContext* ctx;
+  int64_t dummy_result;
+};
+
+Planner planner;
+ObjectPool pool;
+MemTracker tracker;
+
+// Utility function to get prepare select list for exprs.  Assumes this is a
+// constant query
+static Status PrepareSelectList(const TExecRequest& request, ExprContext** ctx) {
+  const TQueryExecRequest& query_request = request.query_exec_request;
+  vector<TExpr> texprs = query_request.fragments[0].output_exprs;
+  DCHECK_EQ(texprs.size(), 1);
+  RETURN_IF_ERROR(Expr::CreateExprTree(&pool, texprs[0], ctx));
+  RETURN_IF_ERROR((*ctx)->Prepare(NULL, RowDescriptor(), &tracker));
+  return Status::OK();
+}
+
+// TODO: handle codegen.  Codegen needs a new driver that is also codegen'd.
+static TestData* GenerateBenchmarkExprs(const string& query, bool codegen) {
+  stringstream ss;
+  ss << "select " << query;
+  TestData* test_data = new TestData;
+  TExecRequest request;
+  ABORT_IF_ERROR(planner.GeneratePlan(ss.str(), &request));
+  ABORT_IF_ERROR(PrepareSelectList(request, &test_data->ctx));
+  return test_data;
+}
+
+const int ITERATIONS = 256;
+
+// Benchmark driver to run expr multiple times.
+void BenchmarkQueryFn(int batch_size, void* d) {
+  TestData* data = reinterpret_cast<TestData*>(d);
+  for (int i = 0; i < batch_size; ++i) {
+    for (int n = 0; n < ITERATIONS; ++n) {
+      void* value = data->ctx->GetValue(NULL);
+      // Dummy result to prevent this from being optimized away
+      data->dummy_result += reinterpret_cast<int64_t>(value);
+    }
+  }
+}
+
+#define BENCHMARK(name, stmt)\
+  suite->AddBenchmark(name, BenchmarkQueryFn, GenerateBenchmarkExprs(stmt, false))
+// Machine Info: Intel(R) Core(TM) i7-2600 CPU @ 3.40GHz
+// Literals:             Function                Rate          Comparison
+// ----------------------------------------------------------------------
+//                            int                2154                  1X
+//                          float                2155              1.001X
+//                         double                2179              1.011X
+//                         string                2179              1.011X
+Benchmark* BenchmarkLiterals() {
+  Benchmark* suite = new Benchmark("Literals");
+  BENCHMARK("int", "1");
+  BENCHMARK("float", "1.1f");
+  BENCHMARK("double", "1.1");
+  BENCHMARK("string", "'1.1'");
+  return suite;
+}
+
+// Arithmetic:           Function                Rate          Comparison
+// ----------------------------------------------------------------------
+//                        int-add               527.5                  1X
+//                     double-add                 528              1.001X
+Benchmark* BenchmarkArithmetic() {
+  Benchmark* suite = new Benchmark("Arithmetic");
+  BENCHMARK("int-add", "1 + 2");
+  BENCHMARK("double-add", "1.1 + 2.2");
+  return suite;
+}
+
+// Machine Info: Intel(R) Core(TM) i7-2600 CPU @ 3.40GHz
+// Like:                 Function                Rate          Comparison
+// ----------------------------------------------------------------------
+//                         equals               203.9                  1X
+//                     not equals               426.4              2.091X
+//                         strstr               142.8             0.7001X
+//                       strncmp1               269.7              1.323X
+//                       strncmp2               294.1              1.442X
+//                       strncmp3               775.7              3.804X
+//                          regex                19.7             0.0966X
+Benchmark* BenchmarkLike() {
+  Benchmark* suite = new Benchmark("Like");
+  BENCHMARK("equals", "'abcdefghijklmnopqrstuvwxyz' = 'abcdefghijklmnopqrstuvwxyz'");
+  BENCHMARK("not equals", "'abcdefghijklmnopqrstuvwxyz' = 'lmnopqrstuvwxyz'");
+  BENCHMARK("strstr", "'abcdefghijklmnopqrstuvwxyz' LIKE '%lmnopq%'");
+  BENCHMARK("strncmp1", "'abcdefghijklmnopqrstuvwxyz' LIKE '%xyz'");
+  BENCHMARK("strncmp2", "'abcdefghijklmnopqrstuvwxyz' LIKE 'abc%'");
+  BENCHMARK("strncmp3", "'abcdefghijklmnopqrstuvwxyz' LIKE 'abc'");
+  BENCHMARK("regex", "'abcdefghijklmnopqrstuvwxyz' LIKE 'abc%z'");
+  return suite;
+}
+
+// Cast:                 Function                Rate          Comparison
+// ----------------------------------------------------------------------
+//                     int_to_int                 824                  1X
+//                    int_to_bool                 878              1.066X
+//                  int_to_double               775.4              0.941X
+//                  int_to_string               32.47            0.03941X
+//              double_to_boolean               823.5             0.9994X
+//               double_to_bigint               775.4              0.941X
+//               double_to_string               4.682           0.005682X
+//                  string_to_int               402.6             0.4886X
+//                string_to_float               145.8             0.1769X
+//            string_to_timestamp               83.76             0.1017X
+Benchmark* BenchmarkCast() {
+  Benchmark* suite = new Benchmark("Cast");
+  BENCHMARK("int_to_int", "cast(1 as INT)");
+  BENCHMARK("int_to_bool", "cast(1 as BOOLEAN)");
+  BENCHMARK("int_to_double", "cast(1 as DOUBLE)");
+  BENCHMARK("int_to_string", "cast(1 as STRING)");
+  BENCHMARK("double_to_boolean", "cast(3.14 as BOOLEAN)");
+  BENCHMARK("double_to_bigint", "cast(3.14 as BIGINT)");
+  BENCHMARK("double_to_string", "cast(3.14 as STRING)");
+  BENCHMARK("string_to_int", "cast('1234' as INT)");
+  BENCHMARK("string_to_float", "cast('1234.5678' as FLOAT)");
+  BENCHMARK("string_to_timestamp", "cast('2011-10-22 09:10:11' as TIMESTAMP)");
+  return suite;
+}
+
+// ConditionalFunctions: Function                Rate          Comparison
+// ----------------------------------------------------------------------
+//                       not_null               877.8                  1X
+//                        is null               938.3              1.069X
+//                       compound               240.2             0.2736X
+//                    int_between                 191             0.2176X
+//              timestamp_between                18.5            0.02108X
+//                 string_between               93.94              0.107X
+//                        bool_in               356.6             0.4063X
+//                         int_in               209.7             0.2389X
+//                       float_in               216.4             0.2465X
+//                      string_in               120.1             0.1368X
+//                   timestamp_in               19.79            0.02255X
+//                         if_int               506.8             0.5773X
+//                      if_string               470.6             0.5361X
+//                   if_timestamp               70.19            0.07996X
+//                  coalesce_bool               194.2             0.2213X
+//                       case_int                 259             0.2951X
+Benchmark* BenchmarkConditionalFunctions() {
+// TODO: expand these cases when the parser issues are fixed (see corresponding tests
+// in expr-test).
+  Benchmark* suite = new Benchmark("ConditionalFunctions");
+  BENCHMARK("not_null", "!NULL");
+  BENCHMARK("is null", "5 IS NOT NULL");
+  BENCHMARK("compound", "(TRUE && TRUE) || FALSE");
+  BENCHMARK("int_between", "5 between 5 and 6");
+  BENCHMARK("timestamp_between", "cast('2011-10-22 09:10:11' as timestamp) between "
+      "cast('2011-09-22 09:10:11' as timestamp) and "
+      "cast('2011-12-22 09:10:11' as timestamp)");
+  BENCHMARK("string_between", "'abc' between 'aaa' and 'aab'");
+  BENCHMARK("bool_in", "true in (true, false, false)");
+  BENCHMARK("int_in", "1 in (2, 3, 1)");
+  BENCHMARK("float_in","1.1 not in (2, 3, 4.5)");
+  BENCHMARK("string_in", "'ab' in ('cd', 'efg', 'ab', 'h')");
+  BENCHMARK("timestamp_in", "cast('2011-11-23' as timestamp) "
+        "in (cast('2011-11-22 09:10:11' as timestamp), "
+        "cast('2011-11-23 09:11:12' as timestamp), "
+        "cast('2011-11-24 09:12:13' as timestamp))");
+  BENCHMARK("if_int", "if(TRUE, 10, 20)");
+  BENCHMARK("if_string", "if(TRUE, 'abc', 'defgh')");
+  BENCHMARK("if_timestamp", "if(TRUE, cast('2011-01-01 09:01:01' as timestamp), "
+      "cast('1999-06-14 19:07:25' as timestamp))");
+  BENCHMARK("coalesce_bool", "coalesce(if(true, NULL, NULL), if(true, NULL, NULL))");
+  BENCHMARK("case_int", "case 21 when 20 then 1 when 19 then 2 when 21 then 3 end");
+  return suite;
+}
+
+// StringFunctions:      Function                Rate          Comparison
+// ----------------------------------------------------------------------
+//                         length               920.2                  1X
+//                     substring1               351.4             0.3819X
+//                     substring2               327.9             0.3563X
+//                           left               508.6             0.5527X
+//                          right               508.2             0.5522X
+//                          lower               103.9             0.1129X
+//                          upper               103.2             0.1121X
+//                        reverse               324.9             0.3531X
+//                           trim               421.2             0.4578X
+//                          ltrim               526.6             0.5723X
+//                          rtrim               566.5             0.6156X
+//                          space               94.63             0.1028X
+//                          ascii                1048              1.139X
+//                          instr               175.6             0.1909X
+//                         locate               184.7             0.2007X
+//                        locate2               175.8             0.1911X
+//                         concat               109.5              0.119X
+//                        concat2               75.83            0.08241X
+//                       concatws               143.4             0.1559X
+//                      concatws2               70.38            0.07649X
+//                         repeat               98.54             0.1071X
+//                           lpad               154.7             0.1681X
+//                           rpad               145.6             0.1582X
+//                    find_in_set               83.38            0.09061X
+//                 regexp_extract                6.42           0.006977X
+//                 regexp_replace              0.7435           0.000808X
+Benchmark* BenchmarkStringFunctions() {
+  Benchmark* suite = new Benchmark("StringFunctions");
+  BENCHMARK("length", "length('Hello World!')");
+  BENCHMARK("substring1", "substring('Hello World!', 5)");
+  BENCHMARK("substring2", "substring('Hello World!', 5, 5)");
+  BENCHMARK("left", "strleft('Hello World!', 7)");
+  BENCHMARK("right", "strleft('Hello World!', 7)");
+  BENCHMARK("lower", "lower('Hello World!')");
+  BENCHMARK("upper", "upper('Hello World!')");
+  BENCHMARK("reverse", "reverse('Hello World!')");
+  BENCHMARK("trim", "trim('  Hello World!  ')");
+  BENCHMARK("ltrim", "ltrim('  Hello World!  ')");
+  BENCHMARK("rtrim", "rtrim('  Hello World!  ')");
+  BENCHMARK("space", "space(7)");
+  BENCHMARK("ascii", "ascii('abcd')");
+  BENCHMARK("instr", "instr('xyzabc', 'abc')");
+  BENCHMARK("locate", "locate('abc', 'xyzabc')");
+  BENCHMARK("locate2", "locate('abc', 'abcxyzabc', 3)");
+  BENCHMARK("concat", "concat('a', 'bcd')");
+  BENCHMARK("concat2", "concat('a', 'bb', 'ccc', 'dddd')");
+  BENCHMARK("concatws", "concat_ws('a', 'b')");
+  BENCHMARK("concatws2", "concat_ws('a', 'b', 'c', 'd')");
+  BENCHMARK("repeat", "repeat('abc', 7)");
+  BENCHMARK("lpad", "lpad('abc', 7, 'xyz')");
+  BENCHMARK("rpad", "rpad('abc', 7, 'xyz')");
+  BENCHMARK("find_in_set", "find_in_set('ab', 'abc,ad,ab,ade,cde')");
+  BENCHMARK("regexp_extract", "regexp_extract('abxcy1234a', 'a.x.y.*a', 0)");
+  BENCHMARK("regexp_replace", "regexp_replace('axcaycazc', '', 'r')");
+  return suite;
+}
+
+// UrlFunctions:         Function                Rate          Comparison
+// ----------------------------------------------------------------------
+//                      authority               118.1                  1X
+//                           file               95.52              0.809X
+//                           host               94.52             0.8005X
+//                           path               98.63             0.8353X
+//                       protocol               36.29             0.3073X
+//                           user               121.1              1.026X
+//                      user_info               121.4              1.029X
+//                     query_name               41.34             0.3501X
+Benchmark* BenchmarkUrlFunctions() {
+  Benchmark* suite = new Benchmark("UrlFunctions");
+  BENCHMARK("authority", "parse_url('http://user:pass@example.com:80/docs/books/tutorial/"
+      "index.html?name=networking#DOWNLOADING', 'AUTHORITY')");
+  BENCHMARK("file", "parse_url('http://example.com/docs/books/tutorial/"
+      "index.html?name=networking   ', 'FILE')");
+  BENCHMARK("host", "parse_url('http://example.com:80/docs/books/tutorial/"
+      "index.html?name=networking#DOWNLOADING', 'HOST')");
+  BENCHMARK("path", "parse_url('http://user:pass@example.com/docs/books/tutorial/"
+      "index.html?name=networking#DOWNLOADING', 'PATH')");
+  BENCHMARK("protocol", "parse_url('user:pass@example.com/docs/books/tutorial/"
+      "index.html?name=networking#DOWNLOADING', 'PROTOCOL')");
+  BENCHMARK("user", "parse_url('http://user@example.com/docs/books/tutorial/"
+        "index.html?name=networking#DOWNLOADING', 'USERINFO')");
+  BENCHMARK("user_info", "parse_url('http://user:pass@example.com:80/docs/books/tutorial/"
+      "index.html?name=networking#DOWNLOADING', 'USERINFO')");
+  BENCHMARK("query_name", "parse_url('http://example.com:80/docs/books/tutorial/"
+      "index.htmltest=true&name=networking&op=true', 'QUERY', 'name')");
+  return suite;
+}
+
+// MathFunctions:        Function                Rate          Comparison
+// ----------------------------------------------------------------------
+//                             pi                1642                  1X
+//                              e                1546             0.9416X
+//                            abs                 877             0.5342X
+//                             ln               110.7            0.06744X
+//                          log10               88.48             0.0539X
+//                           log2               108.3            0.06597X
+//                            log               55.61            0.03387X
+//                            pow               53.93            0.03285X
+//                           sqrt               629.6             0.3835X
+//                           sign                 732             0.4459X
+//                            sin               176.3             0.1074X
+//                           asin               169.6             0.1033X
+//                            cos               156.3             0.0952X
+//                           acos               167.5              0.102X
+//                            tan               176.3             0.1074X
+//                           atan               153.8            0.09371X
+//                        radians               601.5             0.3664X
+//                        degrees               601.5             0.3664X
+//                            bin                  45            0.02741X
+//                       pmod_int               147.3            0.08976X
+//                     pmod_float               172.9             0.1053X
+//                       positive                 877             0.5342X
+//                       negative               936.9             0.5707X
+//                           ceil               466.7             0.2843X
+//                          floor               390.9             0.2381X
+//                          round               820.5             0.4998X
+//                         round2               220.2             0.1341X
+//                        hex_int               5.745             0.0035X
+//                     hex_string               4.441           0.002705X
+//                          unhex               3.394           0.002067X
+//                       conv_int               33.15            0.02019X
+//                    conv_string                36.6            0.02229X
+Benchmark* BenchmarkMathFunctions() {
+  Benchmark* suite = new Benchmark("MathFunctions");
+  BENCHMARK("pi", "pi()");
+  BENCHMARK("e", "e()");
+  BENCHMARK("abs", "abs(-1.0)");
+  BENCHMARK("ln", "ln(3.14)");
+  BENCHMARK("log10", "log10(3.14)");
+  BENCHMARK("log2", "log2(3.14)");
+  BENCHMARK("log", "log(3.14, 5)");
+  BENCHMARK("pow", "pow(3.14, 5)");
+  BENCHMARK("sqrt", "sqrt(3.14)");
+  BENCHMARK("sign", "sign(1.0)");
+  BENCHMARK("sin", "sin(3.14)");
+  BENCHMARK("asin", "asin(3.14)");
+  BENCHMARK("cos", "cos(3.14)");
+  BENCHMARK("acos", "acos(3.14)");
+  BENCHMARK("tan", "tan(3.14)");
+  BENCHMARK("atan", "atan(3.14)");
+  BENCHMARK("radians", "radians(3.14)");
+  BENCHMARK("degrees", "degrees(3.14)");
+  BENCHMARK("bin", "bin(12345)");
+  BENCHMARK("pmod_int", "pmod(12345, 12)");
+  BENCHMARK("pmod_float", "pmod(12345.678, 12.34)");
+  BENCHMARK("positive", "positive(12345)");
+  BENCHMARK("negative", "negative(12345)");
+  BENCHMARK("ceil", "ceil(-10.05)");
+  BENCHMARK("floor", "floor(-10.05)");
+  BENCHMARK("round", "round(-10.05)");
+  BENCHMARK("round2", "round(-10.056789, 4)");
+  BENCHMARK("hex_int", "hex(16)");
+  BENCHMARK("hex_string", "hex('impala')");
+  BENCHMARK("unhex", "hex('496D70616C61')");
+  BENCHMARK("conv_int", "conv(100101, 2, 36)");
+  BENCHMARK("conv_string", "conv('100101', 2, 36)");
+  return suite;
+}
+
+// TimestampFunctions:   Function                Rate          Comparison
+// ----------------------------------------------------------------------
+//                        literal               68.18                  1X
+//                      to_string               1.131            0.01659X
+//                       add_year               34.57              0.507X
+//                      sub_month               33.04             0.4846X
+//                      add_weeks               56.15             0.8236X
+//                       sub_days               57.21             0.8391X
+//                            add               55.85             0.8191X
+//                      sub_hours               44.44             0.6519X
+//                    add_minutes               43.96             0.6448X
+//                    sub_seconds               42.78             0.6274X
+//                      add_milli               43.43             0.6371X
+//                      sub_micro               43.88             0.6436X
+//                       add_nano               41.83             0.6135X
+//                unix_timestamp1               32.74             0.4803X
+//                unix_timestamp2               39.39             0.5778X
+//                     from_unix1               1.192            0.01748X
+//                     from_unix2               1.602             0.0235X
+//                           year                73.4              1.077X
+//                          month               72.53              1.064X
+//                   day of month               71.98              1.056X
+//                    day of year               56.67             0.8312X
+//                   week of year               50.68             0.7433X
+//                           hour               100.1              1.468X
+//                         minute               97.18              1.425X
+//                         second                96.7              1.418X
+//                        to date               3.075            0.04511X
+//                      date diff               39.54             0.5799X
+Benchmark* BenchmarkTimestampFunctions() {
+  Benchmark* suite = new Benchmark("TimestampFunctions");
+  BENCHMARK("literal", "cast('2012-01-01 09:10:11.123456789' as timestamp)");
+  BENCHMARK("to_string",
+      "cast(cast('2012-01-01 09:10:11.123456789' as timestamp) as string)");
+  BENCHMARK("add_year", "date_add(cast('2012-01-01 09:10:11.123456789' "
+      "as timestamp), interval 10 years)");
+  BENCHMARK("sub_month", "date_sub(cast('2012-02-29 09:10:11.123456789' "
+      "as timestamp), interval 1 month)");
+  BENCHMARK("add_weeks", "date_add(cast('2012-01-01 09:10:11.123456789' "
+      "as timestamp), interval 53 weeks)");
+  BENCHMARK("sub_days", "date_sub(cast('2011-12-22 09:10:11.12345678' "
+      "as timestamp), interval 365 days)");
+  BENCHMARK("add", "date_add(cast('2012-01-01 09:10:11.123456789' "
+      "as timestamp), 10)");
+  BENCHMARK("sub_hours", "date_sub(cast('2012-01-02 01:00:00.123456789' "
+      "as timestamp), interval 25 hours)");
+  BENCHMARK("add_minutes", "date_add(cast('2012-01-01 00:00:00.123456789' "
+      "as timestamp), interval 1533 minutes)");
+  BENCHMARK("sub_seconds", "date_sub(cast('2012-01-02 01:00:33.123456789' "
+      "as timestamp), interval 90033 seconds)");
+  BENCHMARK("add_milli", "date_add(cast('2012-01-01 00:00:00.000000001' "
+      "as timestamp), interval 90000033 milliseconds)");
+  BENCHMARK("sub_micro", "date_sub(cast('2012-01-01 00:00:00.001033001' "
+      "as timestamp), interval 1033 microseconds)");
+  BENCHMARK("add_nano", "date_add(cast('2012-01-01 00:00:00.000000001' "
+      "as timestamp), interval 1033 nanoseconds)");
+  BENCHMARK("unix_timestamp1",
+      "unix_timestamp('1970-01-01 00:00:00', 'yyyy-MM-dd HH:mm:ss')");
+  BENCHMARK("unix_timestamp2",
+      "unix_timestamp('1970-10-01', 'yyyy-MM-dd')");
+  BENCHMARK("from_unix1", "from_unixtime(0, 'yyyy-MM-dd HH:mm:ss')");
+  BENCHMARK("from_unix2", "from_unixtime(0, 'yyyy-MM-dd')");
+  BENCHMARK("year", "year(cast('2011-12-22' as timestamp))");
+  BENCHMARK("month", "month(cast('2011-12-22' as timestamp))");
+  BENCHMARK("day of month", "dayofmonth(cast('2011-12-22' as timestamp))");
+  BENCHMARK("day of year", "dayofyear(cast('2011-12-22' as timestamp))");
+  BENCHMARK("week of year", "weekofyear(cast('2011-12-22' as timestamp))");
+  BENCHMARK("hour", "hour(cast('09:10:11.000000' as timestamp))");
+  BENCHMARK("minute", "minute(cast('09:10:11.000000' as timestamp))");
+  BENCHMARK("second", "second(cast('09:10:11.000000' as timestamp))");
+  BENCHMARK("to date",
+      "to_date(cast('2011-12-22 09:10:11.12345678' as timestamp))");
+  BENCHMARK("date diff", "datediff(cast('2011-12-22 09:10:11.12345678' as timestamp), "
+      "cast('2012-12-22' as timestamp))");
+#if 0
+  // TODO: need to create a valid runtime state for these functions
+  BENCHMARK("from utc",
+      "from_utc_timestamp(cast(1.3041352164485E9 as timestamp), 'PST')");
+  BENCHMARK("to utc",
+      "to_utc_timestamp(cast('2011-01-01 01:01:01' as timestamp), 'PST')");
+  BENCHMARK("now", "now()");
+  BENCHMARK("unix_timestamp", "unix_timestamp()");
+#endif
+  return suite;
+}
+
+int main(int argc, char** argv) {
+  CpuInfo::Init();
+
+  // Generate all the tests first (this does the planning)
+  Benchmark* literals = BenchmarkLiterals();
+  Benchmark* arithmetics = BenchmarkArithmetic();
+  Benchmark* like = BenchmarkLike();
+  Benchmark* cast = BenchmarkCast();
+  Benchmark* conditional_fns = BenchmarkConditionalFunctions();
+  Benchmark* string_fns = BenchmarkStringFunctions();
+  Benchmark* url_fns = BenchmarkUrlFunctions();
+  Benchmark* math_fns = BenchmarkMathFunctions();
+  Benchmark* timestamp_fns = BenchmarkTimestampFunctions();
+
+  cout << Benchmark::GetMachineInfo() << endl;
+  cout << literals->Measure() << endl;
+  cout << arithmetics->Measure() << endl;
+  cout << like->Measure() << endl;
+  cout << cast->Measure() << endl;
+  cout << conditional_fns->Measure() << endl;
+  cout << string_fns->Measure() << endl;
+  cout << url_fns->Measure() << endl;
+  cout << math_fns->Measure() << endl;
+  cout << timestamp_fns->Measure() << endl;
+
+  return 0;
+}

http://git-wip-us.apache.org/repos/asf/incubator-impala/blob/667a778a/be/src/benchmarks/in-predicate-benchmark.cc
----------------------------------------------------------------------
diff --git a/be/src/benchmarks/in-predicate-benchmark.cc b/be/src/benchmarks/in-predicate-benchmark.cc
new file mode 100644
index 0000000..f337e1e
--- /dev/null
+++ b/be/src/benchmarks/in-predicate-benchmark.cc
@@ -0,0 +1,332 @@
+// Copyright 2015 Cloudera Inc.
+//
+// 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.
+
+
+// Note: The results do not include the pre-processing in the prepare function that is
+// necessary for SetLookup but not Iterate. None of the values searched for are in the
+// fabricated IN list (i.e. hit rate is 0).
+
+// Machine Info: Intel(R) Core(TM) i7-2600 CPU @ 3.40GHz
+// int n=1:              Function     Rate (iters/ms)          Comparison
+// ----------------------------------------------------------------------
+//                  SetLookup n=1               902.4                  1X
+//                    Iterate n=1               938.3               1.04X
+
+// int n=2:              Function     Rate (iters/ms)          Comparison
+// ----------------------------------------------------------------------
+//                  SetLookup n=2               888.6                  1X
+//                    Iterate n=2               805.6             0.9066X
+
+// int n=3:              Function     Rate (iters/ms)          Comparison
+// ----------------------------------------------------------------------
+//                  SetLookup n=3               806.5                  1X
+//                    Iterate n=3               744.1             0.9227X
+
+// int n=4:              Function     Rate (iters/ms)          Comparison
+// ----------------------------------------------------------------------
+//                  SetLookup n=4               784.1                  1X
+//                    Iterate n=4                 661              0.843X
+
+// int n=5:              Function     Rate (iters/ms)          Comparison
+// ----------------------------------------------------------------------
+//                  SetLookup n=5               801.6                  1X
+//                    Iterate n=5               594.4             0.7415X
+
+// int n=6:              Function     Rate (iters/ms)          Comparison
+// ----------------------------------------------------------------------
+//                  SetLookup n=6               746.6                  1X
+//                    Iterate n=6                 539              0.722X
+
+// int n=7:              Function     Rate (iters/ms)          Comparison
+// ----------------------------------------------------------------------
+//                  SetLookup n=7               683.4                  1X
+//                    Iterate n=7               493.9             0.7226X
+
+// int n=8:              Function     Rate (iters/ms)          Comparison
+// ----------------------------------------------------------------------
+//                  SetLookup n=8                 772                  1X
+//                    Iterate n=8               455.5               0.59X
+
+// int n=9:              Function     Rate (iters/ms)          Comparison
+// ----------------------------------------------------------------------
+//                  SetLookup n=9               702.9                  1X
+//                    Iterate n=9               420.1             0.5976X
+
+// int n=10:             Function     Rate (iters/ms)          Comparison
+// ----------------------------------------------------------------------
+//                 SetLookup n=10               710.7                  1X
+//                   Iterate n=10               392.4             0.5521X
+
+// int n=400:            Function     Rate (iters/ms)          Comparison
+// ----------------------------------------------------------------------
+//                SetLookup n=400               422.3                  1X
+//                  Iterate n=400               14.01            0.03318X
+
+
+// string n=1:           Function     Rate (iters/ms)          Comparison
+// ----------------------------------------------------------------------
+//                  SetLookup n=1               250.8                  1X
+//                    Iterate n=1               540.4              2.154X
+
+// string n=2:           Function     Rate (iters/ms)          Comparison
+// ----------------------------------------------------------------------
+//                  SetLookup n=2                 205                  1X
+//                    Iterate n=2               297.7              1.453X
+
+// string n=3:           Function     Rate (iters/ms)          Comparison
+// ----------------------------------------------------------------------
+//                  SetLookup n=3               166.8                  1X
+//                    Iterate n=3               240.3              1.441X
+
+// string n=4:           Function     Rate (iters/ms)          Comparison
+// ----------------------------------------------------------------------
+//                  SetLookup n=4               146.2                  1X
+//                    Iterate n=4               177.8              1.216X
+
+// string n=5:           Function     Rate (iters/ms)          Comparison
+// ----------------------------------------------------------------------
+//                  SetLookup n=5               149.9                  1X
+//                    Iterate n=5               144.8             0.9662X
+
+// string n=6:           Function     Rate (iters/ms)          Comparison
+// ----------------------------------------------------------------------
+//                  SetLookup n=6               135.9                  1X
+//                    Iterate n=6               127.4             0.9372X
+
+// string n=7:           Function     Rate (iters/ms)          Comparison
+// ----------------------------------------------------------------------
+//                  SetLookup n=7               143.4                  1X
+//                    Iterate n=7               112.8             0.7866X
+
+// string n=8:           Function     Rate (iters/ms)          Comparison
+// ----------------------------------------------------------------------
+//                  SetLookup n=8               123.7                  1X
+//                    Iterate n=8               117.1             0.9467X
+
+// string n=9:           Function     Rate (iters/ms)          Comparison
+// ----------------------------------------------------------------------
+//                  SetLookup n=9                 117                  1X
+//                    Iterate n=9               89.19              0.762X
+
+// string n=10:          Function     Rate (iters/ms)          Comparison
+// ----------------------------------------------------------------------
+//                 SetLookup n=10               125.4                  1X
+//                   Iterate n=10               81.63             0.6508X
+
+// string n=400:         Function     Rate (iters/ms)          Comparison
+// ----------------------------------------------------------------------
+//                SetLookup n=400               55.77                  1X
+//                  Iterate n=400               1.936            0.03471X
+
+// decimal(4,0) n=1:     Function     Rate (iters/ms)          Comparison
+// ----------------------------------------------------------------------
+//                  SetLookup n=1               587.9                  1X
+//                    Iterate n=1               658.3               1.12X
+
+// decimal(4,0) n=2:     Function     Rate (iters/ms)          Comparison
+// ----------------------------------------------------------------------
+//                  SetLookup n=2               521.5                  1X
+//                    Iterate n=2               478.5             0.9175X
+
+// decimal(4,0) n=3:     Function     Rate (iters/ms)          Comparison
+// ----------------------------------------------------------------------
+//                  SetLookup n=3                 524                  1X
+//                    Iterate n=3               373.7             0.7132X
+
+// decimal(4,0) n=4:     Function     Rate (iters/ms)          Comparison
+// ----------------------------------------------------------------------
+//                  SetLookup n=4               486.6                  1X
+//                    Iterate n=4               308.9             0.6348X
+
+// decimal(4,0) n=400:   Function     Rate (iters/ms)          Comparison
+// ----------------------------------------------------------------------
+//                SetLookup n=400               258.2                  1X
+//                  Iterate n=400               4.272            0.01655X
+
+#include <boost/lexical_cast.hpp>
+#include <gutil/strings/substitute.h>
+
+#include "exprs/in-predicate.h"
+#include "exprs/in-predicate-ir.cc"
+
+#include "udf/udf-test-harness.h"
+#include "util/benchmark.h"
+#include "util/cpu-info.h"
+
+#include "common/names.h"
+
+using namespace impala;
+using namespace impala_udf;
+using namespace strings;
+
+namespace impala {
+
+template<typename T> T MakeAnyVal(int v) {
+  return T(v);
+}
+
+template<> StringVal MakeAnyVal(int v) {
+  // Leak these strings so we don't have to worry about them going out of scope
+  string* s = new string();
+  *s = lexical_cast<string>(v);
+  return StringVal(reinterpret_cast<uint8_t*>(const_cast<char*>(s->c_str())), s->size());
+}
+
+class InPredicateBenchmark {
+ public:
+  template<typename T, typename SetType>
+  struct TestData {
+    vector<T> anyvals;
+    vector<AnyVal*> anyval_ptrs;
+    InPredicate::SetLookupState<SetType> state;
+
+    vector<T> search_vals;
+
+    int total_found_set;
+    int total_set;
+    int total_found_iter;
+    int total_iter;
+  };
+
+  template<typename T, typename SetType>
+  static TestData<T, SetType> CreateTestData(int num_values,
+      const FunctionContext::TypeDesc& type, int num_search_vals = 100) {
+    srand(time(NULL));
+    TestData<T, SetType> data;
+    data.anyvals.resize(num_values);
+    data.anyval_ptrs.resize(num_values);
+    for (int i = 0; i < num_values; ++i) {
+      data.anyvals[i] = MakeAnyVal<T>(rand());
+      data.anyval_ptrs[i] = &data.anyvals[i];
+    }
+
+    for (int i = 0; i < num_search_vals; ++i) {
+      data.search_vals.push_back(MakeAnyVal<T>(rand()));
+    }
+
+    FunctionContext* ctx = CreateContext(num_values, type);
+
+    vector<AnyVal*> constant_args;
+    constant_args.push_back(NULL);
+    for (AnyVal* p: data.anyval_ptrs) constant_args.push_back(p);
+    UdfTestHarness::SetConstantArgs(ctx, constant_args);
+
+    InPredicate::SetLookupPrepare<T, SetType>(ctx, FunctionContext::FRAGMENT_LOCAL);
+    data.state = *reinterpret_cast<InPredicate::SetLookupState<SetType>*>(
+        ctx->GetFunctionState(FunctionContext::FRAGMENT_LOCAL));
+
+    data.total_found_set = data.total_set = data.total_found_iter = data.total_iter = 0;
+    return data;
+  }
+
+  template<typename T, typename SetType>
+  static void TestSetLookup(int batch_size, void* d) {
+    TestData<T, SetType>* data = reinterpret_cast<TestData<T, SetType>*>(d);
+    for (int i = 0; i < batch_size; ++i) {
+      for (const T& search_val: data->search_vals) {
+        BooleanVal found = InPredicate::SetLookup(&data->state, search_val);
+        if (found.val) ++data->total_found_set;
+        ++data->total_set;
+      }
+    }
+  }
+
+  template<typename T, typename SetType>
+  static void TestIterate(int batch_size, void* d) {
+    TestData<T, SetType>* data = reinterpret_cast<TestData<T, SetType>*>(d);
+    for (int i = 0; i < batch_size; ++i) {
+      for (const T& search_val: data->search_vals) {
+        BooleanVal found = InPredicate::Iterate(
+            data->state.type, search_val, data->anyvals.size(), &data->anyvals[0]);
+        if (found.val) ++data->total_found_iter;
+        ++data->total_iter;
+      }
+    }
+  }
+
+  static void RunIntBenchmark(int n) {
+    Benchmark suite(Substitute("int n=$0", n));
+    FunctionContext::TypeDesc type;
+    type.type = FunctionContext::TYPE_INT;
+    TestData<IntVal, int32_t> data =
+        InPredicateBenchmark::CreateTestData<IntVal, int32_t>(n, type);
+    suite.AddBenchmark(Substitute("SetLookup n=$0", n),
+                       InPredicateBenchmark::TestSetLookup<IntVal, int32_t>, &data);
+    suite.AddBenchmark(Substitute("Iterate n=$0", n),
+                       InPredicateBenchmark::TestIterate<IntVal, int32_t>, &data);
+    cout << suite.Measure() << endl;
+    // cout << "Found set: " << (double)data.total_found_set / data.total_set << endl;
+    // cout << "Found iter: " << (double)data.total_found_iter / data.total_iter << endl;
+  }
+
+  static void RunStringBenchmark(int n) {
+    Benchmark suite(Substitute("string n=$0", n));
+    FunctionContext::TypeDesc type;
+    type.type = FunctionContext::TYPE_STRING;
+    TestData<StringVal, StringValue> data =
+        InPredicateBenchmark::CreateTestData<StringVal, StringValue>(n, type);
+    suite.AddBenchmark(Substitute("SetLookup n=$0", n),
+                       InPredicateBenchmark::TestSetLookup<StringVal, StringValue>, &data);
+    suite.AddBenchmark(Substitute("Iterate n=$0", n),
+                       InPredicateBenchmark::TestIterate<StringVal, StringValue>, &data);
+    cout << suite.Measure() << endl;
+    // cout << "Found set: " << (double)data.total_found_set / data.total_set << endl;
+    // cout << "Found iter: " << (double)data.total_found_iter / data.total_iter << endl;
+  }
+
+  static void RunDecimalBenchmark(int n) {
+    Benchmark suite(Substitute("decimal(4,0) n=$0", n));
+    FunctionContext::TypeDesc type;
+    type.type = FunctionContext::TYPE_DECIMAL;
+    type.precision = 4;
+    type.scale = 0;
+    TestData<DecimalVal, Decimal16Value> data =
+        InPredicateBenchmark::CreateTestData<DecimalVal, Decimal16Value>(n, type);
+    suite.AddBenchmark(Substitute("SetLookup n=$0", n),
+                       InPredicateBenchmark::TestSetLookup<DecimalVal, Decimal16Value>, &data);
+    suite.AddBenchmark(Substitute("Iterate n=$0", n),
+                       InPredicateBenchmark::TestIterate<DecimalVal, Decimal16Value>, &data);
+    cout << suite.Measure() << endl;
+  }
+
+ private:
+  static FunctionContext* CreateContext(
+      int num_args, const FunctionContext::TypeDesc& type) {
+    // Types don't matter (but number of args do)
+    FunctionContext::TypeDesc ret_type;
+    vector<FunctionContext::TypeDesc> arg_types(num_args + 1, type);
+    return UdfTestHarness::CreateTestContext(ret_type, arg_types);
+  }
+
+};
+
+}
+
+int main(int argc, char **argv) {
+  CpuInfo::Init();
+  cout << Benchmark::GetMachineInfo() << endl;
+
+  for (int i = 1; i <= 10; ++i) InPredicateBenchmark::RunIntBenchmark(i);
+  InPredicateBenchmark::RunIntBenchmark(400);
+
+  cout << endl;
+
+  for (int i = 1; i <= 10; ++i) InPredicateBenchmark::RunStringBenchmark(i);
+  InPredicateBenchmark::RunStringBenchmark(400);
+
+  for (int i = 1; i <= 4; ++i) InPredicateBenchmark::RunDecimalBenchmark(i);
+  InPredicateBenchmark::RunDecimalBenchmark(400);
+
+  return 0;
+}

http://git-wip-us.apache.org/repos/asf/incubator-impala/blob/667a778a/be/src/benchmarks/network-perf-benchmark.cc
----------------------------------------------------------------------
diff --git a/be/src/benchmarks/network-perf-benchmark.cc b/be/src/benchmarks/network-perf-benchmark.cc
new file mode 100644
index 0000000..b218c97
--- /dev/null
+++ b/be/src/benchmarks/network-perf-benchmark.cc
@@ -0,0 +1,243 @@
+// Copyright 2012 Cloudera Inc.
+//
+// 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.
+
+#include <iostream>
+
+#include <thrift/protocol/TBinaryProtocol.h>
+#include <thrift/protocol/TDebugProtocol.h>
+#include <thrift/transport/TSocket.h>
+#include <thrift/transport/TTransportUtils.h>
+
+#include <boost/algorithm/string.hpp>
+#include <boost/thread/thread.hpp>
+#include "gen-cpp/NetworkTest_types.h"
+#include "gen-cpp/NetworkTestService.h"
+
+#include "common/logging.h"
+#include "util/cpu-info.h"
+#include "util/stopwatch.h"
+#include "rpc/thrift-client.h"
+#include "rpc/thrift-server.h"
+#include "rpc/thrift-thread.h"
+
+#include "common/names.h"
+
+DEFINE_int32(port, 22222, "Port for NetworkTestService");
+DEFINE_int64(send_batch_size, 0, "Batch size (in bytes).  Data is split up into batches");
+
+// Simple client server network speed benchmark utility.  This compiles to
+// a binary that runs as both the client and server.  The server can be started
+// up by just running the binary.  After the server starts up, it will drop into
+// the client 'shell' where benchmarks can be run.
+// The supported benchmarks are:
+//   'send <size in mb> <target ip>'
+//   'broadcast <size in mb> <list of space separated target ips>
+// The command can also be passed in via command line in the same format.  If
+// run in this mode, the server does not start up.
+// For broadcast, the data is sent in parallel to all nodes.
+//
+// The expected usage for measuring 'send' is to start up the server on one machine
+// and issue the send from another.
+// For 'broadcast', the server should be started on all the machines and then the
+// broadcast is issued from one of them.
+
+using boost::algorithm::is_any_of;
+using boost::algorithm::token_compress_on;
+using boost::algorithm::split;
+
+using namespace apache::thrift;
+using namespace apache::thrift::protocol;
+using namespace apache::thrift::transport;
+using namespace apache::thrift::server;
+using namespace apache::thrift::concurrency;
+using namespace impala;
+using namespace impalatest;
+
+
+class TestServer : public NetworkTestServiceIf {
+ public:
+  TestServer() {
+  }
+
+  virtual ~TestServer() {
+  }
+
+  virtual void Send(ThriftDataResult& result, const ThriftDataParams& params) {
+    result.__set_bytes_received(params.data.size());
+  }
+
+  void Server(ThriftServer* server) {
+    server->Start();
+    server->Join();
+  }
+};
+
+// Send bytes to client respecting the batch size
+// Returns the rate in mb/s to send the data.
+double Send(ThriftClient<NetworkTestServiceClient>* client, int64_t bytes) {
+  int64_t batch_size = FLAGS_send_batch_size;
+  if (batch_size == 0) batch_size = bytes;
+  int64_t total_sent = 0;
+
+  MonotonicStopWatch timer;
+  timer.Start();
+  while (total_sent < bytes) {
+    int64_t send_size = min(bytes - total_sent, batch_size);
+    total_sent += send_size;
+
+    ThriftDataParams data;
+    ThriftDataResult result;
+    data.data.resize(send_size);
+    client->iface()->Send(result, data);
+
+    if (result.bytes_received != send_size) {
+      return -1;
+    }
+  }
+  timer.Stop();
+
+  double mb = bytes / (1024. * 1024.);
+  double sec = timer.ElapsedTime() / (1000.) / (1000.) / (1000.);
+  return mb/sec;
+}
+
+// Send tokens[1] megabytes to tokens[2]
+void HandleSend(const vector<string>& tokens) {
+  if (tokens.size() != 3) {
+    return;
+  }
+
+  int64_t mbs = atoi(tokens[1].c_str());
+  int64_t bytes = mbs * (1024L * 1024L);
+  cout << "Sending " << mbs << " megabytes..." << endl;
+  const string& ip = tokens[2];
+
+  ThriftClient<NetworkTestServiceClient> client(ip, FLAGS_port);
+  Status status = client.Open();
+  if (!status.ok()) {
+    cerr << "Could not connect to server" << endl;
+    return;
+  }
+
+  double rate = Send(&client, bytes);
+  if (rate < 0) {
+    cerr << "Send failed";
+    return;
+  }
+  cout << "Send rate: (MB/s): " << rate << endl;
+}
+
+// Broadcast tokens[1] megabytes to tokens[2...n] nodes in parallel.
+void HandleBroadcast(const vector<string>& tokens) {
+  if (tokens.size() <= 2) {
+    return;
+  }
+  int64_t mbs = atoi(tokens[1].c_str());
+  int64_t bytes = mbs * (1024L * 1024L);
+  cout << "Broadcasting " << mbs << " megabytes..." << endl;
+
+  vector<ThriftClient<NetworkTestServiceClient>* > clients;
+  for (int i = 2; i < tokens.size(); ++i) {
+    ThriftClient<NetworkTestServiceClient>* client =
+        new ThriftClient<NetworkTestServiceClient>(tokens[i], FLAGS_port);
+    Status status = client->Open();
+    if (!status.ok()) {
+      cerr << "Could not connect to server: " << tokens[i] << endl;
+      return;
+    }
+    clients.push_back(client);
+  }
+
+  MonotonicStopWatch timer;
+  timer.Start();
+  thread_group threads;
+  for (int i = 0; i < clients.size(); ++i) {
+    threads.add_thread(new thread(Send, clients[i], bytes));
+  }
+  threads.join_all();
+  timer.Stop();
+
+  double mb = bytes / (1024 * 1024.);
+  double sec = timer.ElapsedTime() / (1000.) / (1000.) / (1000.);
+
+  cout << "Send rate per node: (MB/s) " << (mb/sec) << endl;
+  cout << "Send rate cluster: (MB/s) " << (mb * clients.size() / sec) << endl;
+}
+
+void ConvertToLowerCase(vector<string>* tokens) {
+  for (int i = 0; i < tokens->size(); ++i) {
+    transform(
+        (*tokens)[i].begin(), (*tokens)[i].end(), (*tokens)[i].begin(), ::tolower);
+  }
+}
+
+bool ProcessCommand(const vector<string>& tokens) {
+  if (tokens.empty()) return false;
+
+  if (tokens[0] == "quit") return true;;
+
+  if (tokens[0] == "send") {
+    HandleSend(tokens);
+  } else if (tokens[0] == "broadcast") {
+    HandleBroadcast(tokens);
+  } else {
+    cerr << "Invalid command" << endl;
+    return false;
+  }
+  return false;
+}
+
+int main(int argc, char** argv) {
+  google::ParseCommandLineFlags(&argc, &argv, true);
+  CpuInfo::Init();
+
+  if (argc != 1) {
+    // Just run client from command line args
+    vector<string> tokens;
+    for (int i = 1; i < argc; ++i) {
+      tokens.push_back(argv[i]);
+    }
+    ConvertToLowerCase(&tokens);
+    ProcessCommand(tokens);
+    return 0;
+  }
+
+  // Start up server and client shell
+  shared_ptr<TestServer> handler(new TestServer);
+  shared_ptr<ThreadFactory> thread_factory(new ThriftThreadFactory("test", "test"));
+  shared_ptr<TProcessor> processor(new NetworkTestServiceProcessor(handler));
+  ThriftServer* server = new ThriftServer("Network Test Server", processor,
+      FLAGS_port, NULL, NULL, 100, ThriftServer::ThreadPool);
+  thread* server_thread = new thread(&TestServer::Server, handler.get(), server);
+
+  string input;
+  while (1) {
+    vector<string> tokens;
+    cout << "> ";
+    cout.flush();
+
+    getline(cin, input);
+    if (cin.eof()) break;
+
+    split(tokens, input, is_any_of(" "), token_compress_on);
+
+    ConvertToLowerCase(&tokens);
+    if (ProcessCommand(tokens)) break;
+  }
+
+  server->StopForTesting();
+  server_thread->join();
+
+  return 0;
+}

http://git-wip-us.apache.org/repos/asf/incubator-impala/blob/667a778a/be/src/exprs/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/be/src/exprs/CMakeLists.txt b/be/src/exprs/CMakeLists.txt
index 747add3..dd5ab13 100644
--- a/be/src/exprs/CMakeLists.txt
+++ b/be/src/exprs/CMakeLists.txt
@@ -56,9 +56,6 @@ add_library(Exprs
 )
 add_dependencies(Exprs thrift-deps gen_ir_descriptions)
 
-add_executable(expr-benchmark expr-benchmark.cc)
-target_link_libraries(expr-benchmark ${IMPALA_TEST_LINK_LIBS})
-
 ADD_BE_TEST(expr-test)
 ADD_BE_TEST(expr-codegen-test)
 
@@ -67,5 +64,3 @@ COMPILE_TO_IR(expr-codegen-test.cc)
 add_dependencies(expr-codegen-test-ir thrift-deps)
 
 ADD_UDF_TEST(aggregate-functions-test)
-
-ADD_BE_BENCHMARK(in-predicate-benchmark)

http://git-wip-us.apache.org/repos/asf/incubator-impala/blob/667a778a/be/src/exprs/expr-benchmark.cc
----------------------------------------------------------------------
diff --git a/be/src/exprs/expr-benchmark.cc b/be/src/exprs/expr-benchmark.cc
deleted file mode 100644
index 91f89b5..0000000
--- a/be/src/exprs/expr-benchmark.cc
+++ /dev/null
@@ -1,527 +0,0 @@
-#include <stdio.h>
-#include <iostream>
-
-#include <jni.h>
-#include <thrift/Thrift.h>
-#include <thrift/protocol/TDebugProtocol.h>
-
-#include "exprs/expr.h"
-#include "exprs/expr-context.h"
-#include "util/benchmark.h"
-#include "util/cpu-info.h"
-#include "util/debug-util.h"
-#include "rpc/jni-thrift-util.h"
-
-#include "gen-cpp/Types_types.h"
-#include "gen-cpp/ImpalaService.h"
-#include "gen-cpp/DataSinks_types.h"
-#include "gen-cpp/Types_types.h"
-#include "gen-cpp/ImpalaService.h"
-#include "gen-cpp/ImpalaService_types.h"
-#include "gen-cpp/ImpalaInternalService.h"
-#include "gen-cpp/Frontend_types.h"
-#include "gen-cpp/ImpalaService.h"
-#include "gen-cpp/ImpalaInternalService.h"
-#include "gen-cpp/Frontend_types.h"
-#include "rpc/thrift-server.h"
-#include "common/object-pool.h"
-#include "common/status.h"
-#include "runtime/mem-tracker.h"
-#include "service/impala-server.h"
-
-#include "common/names.h"
-
-using namespace apache::thrift;
-using namespace impala;
-
-// Utility class to take (ascii) sql and return the plan.  This does minimal
-// error handling.
-class Planner {
- public:
-  Planner() {
-    JNIEnv* jni_env = getJNIEnv();
-    // create instance of java class JniFrontend
-    jclass fe_class = jni_env->FindClass("com/cloudera/impala/service/JniFrontend");
-    jmethodID fe_ctor = jni_env->GetMethodID(fe_class, "<init>", "(Z)V");
-    EXIT_IF_EXC(jni_env);
-    create_exec_request_id_ =
-        jni_env->GetMethodID(fe_class, "createExecRequest", "([B)[B");
-    EXIT_IF_EXC(jni_env);
-
-    jboolean lazy = true;
-    jobject fe = jni_env->NewObject(fe_class, fe_ctor, lazy);
-    EXIT_IF_EXC(jni_env);
-    ABORT_IF_ERROR(JniUtil::LocalToGlobalRef(jni_env, fe, &fe_));
-  }
-
-  Status GeneratePlan(const string& stmt, TExecRequest* result) {
-    TQueryCtx query_ctx;
-    query_ctx.request.stmt = stmt;
-    query_ctx.request.query_options = query_options_;
-    query_ctx.__set_session(session_state_);
-    ImpalaServer::PrepareQueryContext(&query_ctx);
-
-    JNIEnv* jni_env = getJNIEnv();
-    JniLocalFrame jni_frame;
-    RETURN_IF_ERROR(jni_frame.push(jni_env));
-    jbyteArray request_bytes;
-    RETURN_IF_ERROR(SerializeThriftMsg(jni_env, &query_ctx, &request_bytes));
-    jbyteArray result_bytes = static_cast<jbyteArray>(
-        jni_env->CallObjectMethod(fe_, create_exec_request_id_, request_bytes));
-    RETURN_ERROR_IF_EXC(jni_env);
-    RETURN_IF_ERROR(DeserializeThriftMsg(jni_env, result_bytes, result));
-    return Status::OK();
-  }
-
- private:
-  jobject fe_;  // instance of com.cloudera.impala.service.JniFrontend
-  jmethodID create_exec_request_id_;  // JniFrontend.createExecRequest()
-
-  TQueryOptions query_options_;
-  TSessionState session_state_;
-};
-
-struct TestData {
-  ExprContext* ctx;
-  int64_t dummy_result;
-};
-
-Planner planner;
-ObjectPool pool;
-MemTracker tracker;
-
-// Utility function to get prepare select list for exprs.  Assumes this is a
-// constant query
-static Status PrepareSelectList(const TExecRequest& request, ExprContext** ctx) {
-  const TQueryExecRequest& query_request = request.query_exec_request;
-  vector<TExpr> texprs = query_request.fragments[0].output_exprs;
-  DCHECK_EQ(texprs.size(), 1);
-  RETURN_IF_ERROR(Expr::CreateExprTree(&pool, texprs[0], ctx));
-  RETURN_IF_ERROR((*ctx)->Prepare(NULL, RowDescriptor(), &tracker));
-  return Status::OK();
-}
-
-// TODO: handle codegen.  Codegen needs a new driver that is also codegen'd.
-static TestData* GenerateBenchmarkExprs(const string& query, bool codegen) {
-  stringstream ss;
-  ss << "select " << query;
-  TestData* test_data = new TestData;
-  TExecRequest request;
-  ABORT_IF_ERROR(planner.GeneratePlan(ss.str(), &request));
-  ABORT_IF_ERROR(PrepareSelectList(request, &test_data->ctx));
-  return test_data;
-}
-
-const int ITERATIONS = 256;
-
-// Benchmark driver to run expr multiple times.
-void BenchmarkQueryFn(int batch_size, void* d) {
-  TestData* data = reinterpret_cast<TestData*>(d);
-  for (int i = 0; i < batch_size; ++i) {
-    for (int n = 0; n < ITERATIONS; ++n) {
-      void* value = data->ctx->GetValue(NULL);
-      // Dummy result to prevent this from being optimized away
-      data->dummy_result += reinterpret_cast<int64_t>(value);
-    }
-  }
-}
-
-#define BENCHMARK(name, stmt)\
-  suite->AddBenchmark(name, BenchmarkQueryFn, GenerateBenchmarkExprs(stmt, false))
-// Machine Info: Intel(R) Core(TM) i7-2600 CPU @ 3.40GHz
-// Literals:             Function                Rate          Comparison
-// ----------------------------------------------------------------------
-//                            int                2154                  1X
-//                          float                2155              1.001X
-//                         double                2179              1.011X
-//                         string                2179              1.011X
-Benchmark* BenchmarkLiterals() {
-  Benchmark* suite = new Benchmark("Literals");
-  BENCHMARK("int", "1");
-  BENCHMARK("float", "1.1f");
-  BENCHMARK("double", "1.1");
-  BENCHMARK("string", "'1.1'");
-  return suite;
-}
-
-// Arithmetic:           Function                Rate          Comparison
-// ----------------------------------------------------------------------
-//                        int-add               527.5                  1X
-//                     double-add                 528              1.001X
-Benchmark* BenchmarkArithmetic() {
-  Benchmark* suite = new Benchmark("Arithmetic");
-  BENCHMARK("int-add", "1 + 2");
-  BENCHMARK("double-add", "1.1 + 2.2");
-  return suite;
-}
-
-// Machine Info: Intel(R) Core(TM) i7-2600 CPU @ 3.40GHz
-// Like:                 Function                Rate          Comparison
-// ----------------------------------------------------------------------
-//                         equals               203.9                  1X
-//                     not equals               426.4              2.091X
-//                         strstr               142.8             0.7001X
-//                       strncmp1               269.7              1.323X
-//                       strncmp2               294.1              1.442X
-//                       strncmp3               775.7              3.804X
-//                          regex                19.7             0.0966X
-Benchmark* BenchmarkLike() {
-  Benchmark* suite = new Benchmark("Like");
-  BENCHMARK("equals", "'abcdefghijklmnopqrstuvwxyz' = 'abcdefghijklmnopqrstuvwxyz'");
-  BENCHMARK("not equals", "'abcdefghijklmnopqrstuvwxyz' = 'lmnopqrstuvwxyz'");
-  BENCHMARK("strstr", "'abcdefghijklmnopqrstuvwxyz' LIKE '%lmnopq%'");
-  BENCHMARK("strncmp1", "'abcdefghijklmnopqrstuvwxyz' LIKE '%xyz'");
-  BENCHMARK("strncmp2", "'abcdefghijklmnopqrstuvwxyz' LIKE 'abc%'");
-  BENCHMARK("strncmp3", "'abcdefghijklmnopqrstuvwxyz' LIKE 'abc'");
-  BENCHMARK("regex", "'abcdefghijklmnopqrstuvwxyz' LIKE 'abc%z'");
-  return suite;
-}
-
-// Cast:                 Function                Rate          Comparison
-// ----------------------------------------------------------------------
-//                     int_to_int                 824                  1X
-//                    int_to_bool                 878              1.066X
-//                  int_to_double               775.4              0.941X
-//                  int_to_string               32.47            0.03941X
-//              double_to_boolean               823.5             0.9994X
-//               double_to_bigint               775.4              0.941X
-//               double_to_string               4.682           0.005682X
-//                  string_to_int               402.6             0.4886X
-//                string_to_float               145.8             0.1769X
-//            string_to_timestamp               83.76             0.1017X
-Benchmark* BenchmarkCast() {
-  Benchmark* suite = new Benchmark("Cast");
-  BENCHMARK("int_to_int", "cast(1 as INT)");
-  BENCHMARK("int_to_bool", "cast(1 as BOOLEAN)");
-  BENCHMARK("int_to_double", "cast(1 as DOUBLE)");
-  BENCHMARK("int_to_string", "cast(1 as STRING)");
-  BENCHMARK("double_to_boolean", "cast(3.14 as BOOLEAN)");
-  BENCHMARK("double_to_bigint", "cast(3.14 as BIGINT)");
-  BENCHMARK("double_to_string", "cast(3.14 as STRING)");
-  BENCHMARK("string_to_int", "cast('1234' as INT)");
-  BENCHMARK("string_to_float", "cast('1234.5678' as FLOAT)");
-  BENCHMARK("string_to_timestamp", "cast('2011-10-22 09:10:11' as TIMESTAMP)");
-  return suite;
-}
-
-// ConditionalFunctions: Function                Rate          Comparison
-// ----------------------------------------------------------------------
-//                       not_null               877.8                  1X
-//                        is null               938.3              1.069X
-//                       compound               240.2             0.2736X
-//                    int_between                 191             0.2176X
-//              timestamp_between                18.5            0.02108X
-//                 string_between               93.94              0.107X
-//                        bool_in               356.6             0.4063X
-//                         int_in               209.7             0.2389X
-//                       float_in               216.4             0.2465X
-//                      string_in               120.1             0.1368X
-//                   timestamp_in               19.79            0.02255X
-//                         if_int               506.8             0.5773X
-//                      if_string               470.6             0.5361X
-//                   if_timestamp               70.19            0.07996X
-//                  coalesce_bool               194.2             0.2213X
-//                       case_int                 259             0.2951X
-Benchmark* BenchmarkConditionalFunctions() {
-// TODO: expand these cases when the parser issues are fixed (see corresponding tests
-// in expr-test).
-  Benchmark* suite = new Benchmark("ConditionalFunctions");
-  BENCHMARK("not_null", "!NULL");
-  BENCHMARK("is null", "5 IS NOT NULL");
-  BENCHMARK("compound", "(TRUE && TRUE) || FALSE");
-  BENCHMARK("int_between", "5 between 5 and 6");
-  BENCHMARK("timestamp_between", "cast('2011-10-22 09:10:11' as timestamp) between "
-      "cast('2011-09-22 09:10:11' as timestamp) and "
-      "cast('2011-12-22 09:10:11' as timestamp)");
-  BENCHMARK("string_between", "'abc' between 'aaa' and 'aab'");
-  BENCHMARK("bool_in", "true in (true, false, false)");
-  BENCHMARK("int_in", "1 in (2, 3, 1)");
-  BENCHMARK("float_in","1.1 not in (2, 3, 4.5)");
-  BENCHMARK("string_in", "'ab' in ('cd', 'efg', 'ab', 'h')");
-  BENCHMARK("timestamp_in", "cast('2011-11-23' as timestamp) "
-        "in (cast('2011-11-22 09:10:11' as timestamp), "
-        "cast('2011-11-23 09:11:12' as timestamp), "
-        "cast('2011-11-24 09:12:13' as timestamp))");
-  BENCHMARK("if_int", "if(TRUE, 10, 20)");
-  BENCHMARK("if_string", "if(TRUE, 'abc', 'defgh')");
-  BENCHMARK("if_timestamp", "if(TRUE, cast('2011-01-01 09:01:01' as timestamp), "
-      "cast('1999-06-14 19:07:25' as timestamp))");
-  BENCHMARK("coalesce_bool", "coalesce(if(true, NULL, NULL), if(true, NULL, NULL))");
-  BENCHMARK("case_int", "case 21 when 20 then 1 when 19 then 2 when 21 then 3 end");
-  return suite;
-}
-
-// StringFunctions:      Function                Rate          Comparison
-// ----------------------------------------------------------------------
-//                         length               920.2                  1X
-//                     substring1               351.4             0.3819X
-//                     substring2               327.9             0.3563X
-//                           left               508.6             0.5527X
-//                          right               508.2             0.5522X
-//                          lower               103.9             0.1129X
-//                          upper               103.2             0.1121X
-//                        reverse               324.9             0.3531X
-//                           trim               421.2             0.4578X
-//                          ltrim               526.6             0.5723X
-//                          rtrim               566.5             0.6156X
-//                          space               94.63             0.1028X
-//                          ascii                1048              1.139X
-//                          instr               175.6             0.1909X
-//                         locate               184.7             0.2007X
-//                        locate2               175.8             0.1911X
-//                         concat               109.5              0.119X
-//                        concat2               75.83            0.08241X
-//                       concatws               143.4             0.1559X
-//                      concatws2               70.38            0.07649X
-//                         repeat               98.54             0.1071X
-//                           lpad               154.7             0.1681X
-//                           rpad               145.6             0.1582X
-//                    find_in_set               83.38            0.09061X
-//                 regexp_extract                6.42           0.006977X
-//                 regexp_replace              0.7435           0.000808X
-Benchmark* BenchmarkStringFunctions() {
-  Benchmark* suite = new Benchmark("StringFunctions");
-  BENCHMARK("length", "length('Hello World!')");
-  BENCHMARK("substring1", "substring('Hello World!', 5)");
-  BENCHMARK("substring2", "substring('Hello World!', 5, 5)");
-  BENCHMARK("left", "strleft('Hello World!', 7)");
-  BENCHMARK("right", "strleft('Hello World!', 7)");
-  BENCHMARK("lower", "lower('Hello World!')");
-  BENCHMARK("upper", "upper('Hello World!')");
-  BENCHMARK("reverse", "reverse('Hello World!')");
-  BENCHMARK("trim", "trim('  Hello World!  ')");
-  BENCHMARK("ltrim", "ltrim('  Hello World!  ')");
-  BENCHMARK("rtrim", "rtrim('  Hello World!  ')");
-  BENCHMARK("space", "space(7)");
-  BENCHMARK("ascii", "ascii('abcd')");
-  BENCHMARK("instr", "instr('xyzabc', 'abc')");
-  BENCHMARK("locate", "locate('abc', 'xyzabc')");
-  BENCHMARK("locate2", "locate('abc', 'abcxyzabc', 3)");
-  BENCHMARK("concat", "concat('a', 'bcd')");
-  BENCHMARK("concat2", "concat('a', 'bb', 'ccc', 'dddd')");
-  BENCHMARK("concatws", "concat_ws('a', 'b')");
-  BENCHMARK("concatws2", "concat_ws('a', 'b', 'c', 'd')");
-  BENCHMARK("repeat", "repeat('abc', 7)");
-  BENCHMARK("lpad", "lpad('abc', 7, 'xyz')");
-  BENCHMARK("rpad", "rpad('abc', 7, 'xyz')");
-  BENCHMARK("find_in_set", "find_in_set('ab', 'abc,ad,ab,ade,cde')");
-  BENCHMARK("regexp_extract", "regexp_extract('abxcy1234a', 'a.x.y.*a', 0)");
-  BENCHMARK("regexp_replace", "regexp_replace('axcaycazc', '', 'r')");
-  return suite;
-}
-
-// UrlFunctions:         Function                Rate          Comparison
-// ----------------------------------------------------------------------
-//                      authority               118.1                  1X
-//                           file               95.52              0.809X
-//                           host               94.52             0.8005X
-//                           path               98.63             0.8353X
-//                       protocol               36.29             0.3073X
-//                           user               121.1              1.026X
-//                      user_info               121.4              1.029X
-//                     query_name               41.34             0.3501X
-Benchmark* BenchmarkUrlFunctions() {
-  Benchmark* suite = new Benchmark("UrlFunctions");
-  BENCHMARK("authority", "parse_url('http://user:pass@example.com:80/docs/books/tutorial/"
-      "index.html?name=networking#DOWNLOADING', 'AUTHORITY')");
-  BENCHMARK("file", "parse_url('http://example.com/docs/books/tutorial/"
-      "index.html?name=networking   ', 'FILE')");
-  BENCHMARK("host", "parse_url('http://example.com:80/docs/books/tutorial/"
-      "index.html?name=networking#DOWNLOADING', 'HOST')");
-  BENCHMARK("path", "parse_url('http://user:pass@example.com/docs/books/tutorial/"
-      "index.html?name=networking#DOWNLOADING', 'PATH')");
-  BENCHMARK("protocol", "parse_url('user:pass@example.com/docs/books/tutorial/"
-      "index.html?name=networking#DOWNLOADING', 'PROTOCOL')");
-  BENCHMARK("user", "parse_url('http://user@example.com/docs/books/tutorial/"
-        "index.html?name=networking#DOWNLOADING', 'USERINFO')");
-  BENCHMARK("user_info", "parse_url('http://user:pass@example.com:80/docs/books/tutorial/"
-      "index.html?name=networking#DOWNLOADING', 'USERINFO')");
-  BENCHMARK("query_name", "parse_url('http://example.com:80/docs/books/tutorial/"
-      "index.htmltest=true&name=networking&op=true', 'QUERY', 'name')");
-  return suite;
-}
-
-// MathFunctions:        Function                Rate          Comparison
-// ----------------------------------------------------------------------
-//                             pi                1642                  1X
-//                              e                1546             0.9416X
-//                            abs                 877             0.5342X
-//                             ln               110.7            0.06744X
-//                          log10               88.48             0.0539X
-//                           log2               108.3            0.06597X
-//                            log               55.61            0.03387X
-//                            pow               53.93            0.03285X
-//                           sqrt               629.6             0.3835X
-//                           sign                 732             0.4459X
-//                            sin               176.3             0.1074X
-//                           asin               169.6             0.1033X
-//                            cos               156.3             0.0952X
-//                           acos               167.5              0.102X
-//                            tan               176.3             0.1074X
-//                           atan               153.8            0.09371X
-//                        radians               601.5             0.3664X
-//                        degrees               601.5             0.3664X
-//                            bin                  45            0.02741X
-//                       pmod_int               147.3            0.08976X
-//                     pmod_float               172.9             0.1053X
-//                       positive                 877             0.5342X
-//                       negative               936.9             0.5707X
-//                           ceil               466.7             0.2843X
-//                          floor               390.9             0.2381X
-//                          round               820.5             0.4998X
-//                         round2               220.2             0.1341X
-//                        hex_int               5.745             0.0035X
-//                     hex_string               4.441           0.002705X
-//                          unhex               3.394           0.002067X
-//                       conv_int               33.15            0.02019X
-//                    conv_string                36.6            0.02229X
-Benchmark* BenchmarkMathFunctions() {
-  Benchmark* suite = new Benchmark("MathFunctions");
-  BENCHMARK("pi", "pi()");
-  BENCHMARK("e", "e()");
-  BENCHMARK("abs", "abs(-1.0)");
-  BENCHMARK("ln", "ln(3.14)");
-  BENCHMARK("log10", "log10(3.14)");
-  BENCHMARK("log2", "log2(3.14)");
-  BENCHMARK("log", "log(3.14, 5)");
-  BENCHMARK("pow", "pow(3.14, 5)");
-  BENCHMARK("sqrt", "sqrt(3.14)");
-  BENCHMARK("sign", "sign(1.0)");
-  BENCHMARK("sin", "sin(3.14)");
-  BENCHMARK("asin", "asin(3.14)");
-  BENCHMARK("cos", "cos(3.14)");
-  BENCHMARK("acos", "acos(3.14)");
-  BENCHMARK("tan", "tan(3.14)");
-  BENCHMARK("atan", "atan(3.14)");
-  BENCHMARK("radians", "radians(3.14)");
-  BENCHMARK("degrees", "degrees(3.14)");
-  BENCHMARK("bin", "bin(12345)");
-  BENCHMARK("pmod_int", "pmod(12345, 12)");
-  BENCHMARK("pmod_float", "pmod(12345.678, 12.34)");
-  BENCHMARK("positive", "positive(12345)");
-  BENCHMARK("negative", "negative(12345)");
-  BENCHMARK("ceil", "ceil(-10.05)");
-  BENCHMARK("floor", "floor(-10.05)");
-  BENCHMARK("round", "round(-10.05)");
-  BENCHMARK("round2", "round(-10.056789, 4)");
-  BENCHMARK("hex_int", "hex(16)");
-  BENCHMARK("hex_string", "hex('impala')");
-  BENCHMARK("unhex", "hex('496D70616C61')");
-  BENCHMARK("conv_int", "conv(100101, 2, 36)");
-  BENCHMARK("conv_string", "conv('100101', 2, 36)");
-  return suite;
-}
-
-// TimestampFunctions:   Function                Rate          Comparison
-// ----------------------------------------------------------------------
-//                        literal               68.18                  1X
-//                      to_string               1.131            0.01659X
-//                       add_year               34.57              0.507X
-//                      sub_month               33.04             0.4846X
-//                      add_weeks               56.15             0.8236X
-//                       sub_days               57.21             0.8391X
-//                            add               55.85             0.8191X
-//                      sub_hours               44.44             0.6519X
-//                    add_minutes               43.96             0.6448X
-//                    sub_seconds               42.78             0.6274X
-//                      add_milli               43.43             0.6371X
-//                      sub_micro               43.88             0.6436X
-//                       add_nano               41.83             0.6135X
-//                unix_timestamp1               32.74             0.4803X
-//                unix_timestamp2               39.39             0.5778X
-//                     from_unix1               1.192            0.01748X
-//                     from_unix2               1.602             0.0235X
-//                           year                73.4              1.077X
-//                          month               72.53              1.064X
-//                   day of month               71.98              1.056X
-//                    day of year               56.67             0.8312X
-//                   week of year               50.68             0.7433X
-//                           hour               100.1              1.468X
-//                         minute               97.18              1.425X
-//                         second                96.7              1.418X
-//                        to date               3.075            0.04511X
-//                      date diff               39.54             0.5799X
-Benchmark* BenchmarkTimestampFunctions() {
-  Benchmark* suite = new Benchmark("TimestampFunctions");
-  BENCHMARK("literal", "cast('2012-01-01 09:10:11.123456789' as timestamp)");
-  BENCHMARK("to_string",
-      "cast(cast('2012-01-01 09:10:11.123456789' as timestamp) as string)");
-  BENCHMARK("add_year", "date_add(cast('2012-01-01 09:10:11.123456789' "
-      "as timestamp), interval 10 years)");
-  BENCHMARK("sub_month", "date_sub(cast('2012-02-29 09:10:11.123456789' "
-      "as timestamp), interval 1 month)");
-  BENCHMARK("add_weeks", "date_add(cast('2012-01-01 09:10:11.123456789' "
-      "as timestamp), interval 53 weeks)");
-  BENCHMARK("sub_days", "date_sub(cast('2011-12-22 09:10:11.12345678' "
-      "as timestamp), interval 365 days)");
-  BENCHMARK("add", "date_add(cast('2012-01-01 09:10:11.123456789' "
-      "as timestamp), 10)");
-  BENCHMARK("sub_hours", "date_sub(cast('2012-01-02 01:00:00.123456789' "
-      "as timestamp), interval 25 hours)");
-  BENCHMARK("add_minutes", "date_add(cast('2012-01-01 00:00:00.123456789' "
-      "as timestamp), interval 1533 minutes)");
-  BENCHMARK("sub_seconds", "date_sub(cast('2012-01-02 01:00:33.123456789' "
-      "as timestamp), interval 90033 seconds)");
-  BENCHMARK("add_milli", "date_add(cast('2012-01-01 00:00:00.000000001' "
-      "as timestamp), interval 90000033 milliseconds)");
-  BENCHMARK("sub_micro", "date_sub(cast('2012-01-01 00:00:00.001033001' "
-      "as timestamp), interval 1033 microseconds)");
-  BENCHMARK("add_nano", "date_add(cast('2012-01-01 00:00:00.000000001' "
-      "as timestamp), interval 1033 nanoseconds)");
-  BENCHMARK("unix_timestamp1",
-      "unix_timestamp('1970-01-01 00:00:00', 'yyyy-MM-dd HH:mm:ss')");
-  BENCHMARK("unix_timestamp2",
-      "unix_timestamp('1970-10-01', 'yyyy-MM-dd')");
-  BENCHMARK("from_unix1", "from_unixtime(0, 'yyyy-MM-dd HH:mm:ss')");
-  BENCHMARK("from_unix2", "from_unixtime(0, 'yyyy-MM-dd')");
-  BENCHMARK("year", "year(cast('2011-12-22' as timestamp))");
-  BENCHMARK("month", "month(cast('2011-12-22' as timestamp))");
-  BENCHMARK("day of month", "dayofmonth(cast('2011-12-22' as timestamp))");
-  BENCHMARK("day of year", "dayofyear(cast('2011-12-22' as timestamp))");
-  BENCHMARK("week of year", "weekofyear(cast('2011-12-22' as timestamp))");
-  BENCHMARK("hour", "hour(cast('09:10:11.000000' as timestamp))");
-  BENCHMARK("minute", "minute(cast('09:10:11.000000' as timestamp))");
-  BENCHMARK("second", "second(cast('09:10:11.000000' as timestamp))");
-  BENCHMARK("to date",
-      "to_date(cast('2011-12-22 09:10:11.12345678' as timestamp))");
-  BENCHMARK("date diff", "datediff(cast('2011-12-22 09:10:11.12345678' as timestamp), "
-      "cast('2012-12-22' as timestamp))");
-#if 0
-  // TODO: need to create a valid runtime state for these functions
-  BENCHMARK("from utc",
-      "from_utc_timestamp(cast(1.3041352164485E9 as timestamp), 'PST')");
-  BENCHMARK("to utc",
-      "to_utc_timestamp(cast('2011-01-01 01:01:01' as timestamp), 'PST')");
-  BENCHMARK("now", "now()");
-  BENCHMARK("unix_timestamp", "unix_timestamp()");
-#endif
-  return suite;
-}
-
-int main(int argc, char** argv) {
-  CpuInfo::Init();
-
-  // Generate all the tests first (this does the planning)
-  Benchmark* literals = BenchmarkLiterals();
-  Benchmark* arithmetics = BenchmarkArithmetic();
-  Benchmark* like = BenchmarkLike();
-  Benchmark* cast = BenchmarkCast();
-  Benchmark* conditional_fns = BenchmarkConditionalFunctions();
-  Benchmark* string_fns = BenchmarkStringFunctions();
-  Benchmark* url_fns = BenchmarkUrlFunctions();
-  Benchmark* math_fns = BenchmarkMathFunctions();
-  Benchmark* timestamp_fns = BenchmarkTimestampFunctions();
-
-  cout << Benchmark::GetMachineInfo() << endl;
-  cout << literals->Measure() << endl;
-  cout << arithmetics->Measure() << endl;
-  cout << like->Measure() << endl;
-  cout << cast->Measure() << endl;
-  cout << conditional_fns->Measure() << endl;
-  cout << string_fns->Measure() << endl;
-  cout << url_fns->Measure() << endl;
-  cout << math_fns->Measure() << endl;
-  cout << timestamp_fns->Measure() << endl;
-
-  return 0;
-}