Files
impala/bin/get_code_size.py
Martin Grund 1afe72830a IMPALA-1916: Replace Status::OK by Status::OK()
By doing so, we avoid unnecessarily calling the copy constructor for
Status OK objects and loading the value from memory (due to the old
Status::OK being a global). The impact of this patch was validated by
inspecting both optimized assembly code and generated IR code.

Applying this patch has some effect on the amount of generated code. The
new tool `get_code_size` will list the text, data, and bss sizes for all
archives that we produce in a release build. This patch reduces the code
size by ~20 kB.

      Text      Data    BSS
Old   10578622  576864  40825
New   10559367  576864  40809

The majority of the changes in this patch have been mechanically applied
using:

   find be/src -name "*.cc" -or -name "*.h" | xargs sed -i
   's/Status::OK;/Status::OK\(\);/'

A new micro-benchmark was added to determine the overhead of using
Status in hot code sections.

Machine Info: Intel(R) Core(TM) i7-4770 CPU @ 3.40GHz
status:               Function     Rate (iters/ms)          Comparison
----------------------------------------------------------------------
             Call Status::OK()           9.555e+08                  1X
     Call static Status::Error           4.515e+07            0.04725X
   Call Status(Code, 'string')           9.873e+06            0.01033X
            Call w/ Assignment           5.422e+08             0.5674X
           Call Cond Branch OK           5.941e+06           0.006218X
        Call Cond Branch ERROR           7.047e+06           0.007375X
 Call Cond Branch Bool (false)           1.914e+10              20.03X
  Call Cond Branch Bool (true)           1.491e+11                156X
Call Cond Boost Optional (true)          3.935e+09              4.118X
Call Cond Boost Optional (false)         2.147e+10              22.47X

Change-Id: I1be6f4c52e2db8cba35b3938a236913faa321e9e
Reviewed-on: http://gerrit.cloudera.org:8080/351
Reviewed-by: Martin Grund <mgrund@cloudera.com>
Tested-by: Internal Jenkins
2015-05-22 09:53:13 +00:00

56 lines
1.7 KiB
Python
Executable File

#!/usr/bin/env python
# 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.
# This tool walks the build directory (release by default) and will print the text, data,
# and bss section sizes of the archives.
import fnmatch
import os
import re
import subprocess
from prettytable import PrettyTable
def get_bin_size_data(file):
data = ""
try:
data = subprocess.check_output(["size", "-B", "-t", file], stderr=subprocess.STDOUT)
except Exception, e:
data = e.output
res = re.split(r'\s+', data.split("\n")[-2])
if len(res[0].strip()) == 0:
return res[1:-3]
else:
return res[:-3]
def find_files(build_type="release"):
root_path = os.path.join(os.getenv("IMPALA_HOME"), "be", "build", build_type)
matches = []
for root, dirs, files in os.walk(root_path):
for filename in fnmatch.filter(files, '*.a'):
matches.append(os.path.join(root, filename))
tab = PrettyTable(["file", "text", "data", "bss"])
sums = ["Total", 0, 0, 0]
for m in matches:
row = [os.path.basename(m)] + get_bin_size_data(m);
tab.add_row(row)
for x in range(1, 4):
sums[x] += int(row[x])
tab.add_row(sums)
print(tab)
if __name__ == "__main__":
find_files()