mirror of
https://github.com/apache/impala.git
synced 2025-12-19 18:12:08 -05:00
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
56 lines
1.7 KiB
Python
Executable File
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()
|