30
30
import check_on_pr
31
31
32
32
# Only show diff 1KB or greater
33
- diff_threshold = 1000
33
+ _DIFF_THRESHOLD = 1000
34
34
35
- size_labels = ('Core' , 'ObjC' , 'BoringSSL' , 'Protobuf' , 'Total' )
35
+ _SIZE_LABELS = ('Core' , 'ObjC' , 'BoringSSL' , 'Protobuf' , 'Total' )
36
36
37
37
argp = argparse .ArgumentParser (
38
38
description = 'Binary size diff of gRPC Objective-C sample' )
@@ -58,19 +58,22 @@ def get_size(where, frameworks):
58
58
build_dir = 'src/objective-c/examples/Sample/Build/Build-%s/' % where
59
59
if not frameworks :
60
60
link_map_filename = 'Build/Intermediates.noindex/Sample.build/Release-iphoneos/Sample.build/Sample-LinkMap-normal-arm64.txt'
61
+ # IMPORTANT: order needs to match labels in _SIZE_LABELS
61
62
return parse_link_map (build_dir + link_map_filename )
62
63
else :
63
64
framework_dir = 'Build/Products/Release-iphoneos/Sample.app/Frameworks/'
64
- boringssl_size = dir_size (build_dir + framework_dir +
65
- 'openssl.framework' )
66
65
core_size = dir_size (build_dir + framework_dir + 'grpc.framework' )
67
66
objc_size = dir_size (build_dir + framework_dir + 'GRPCClient.framework' ) + \
68
67
dir_size (build_dir + framework_dir + 'RxLibrary.framework' ) + \
69
68
dir_size (build_dir + framework_dir + 'ProtoRPC.framework' )
69
+ boringssl_size = dir_size (build_dir + framework_dir +
70
+ 'openssl.framework' )
70
71
protobuf_size = dir_size (build_dir + framework_dir +
71
72
'Protobuf.framework' )
73
+ # a.k.a. "Total"
72
74
app_size = dir_size (build_dir +
73
75
'Build/Products/Release-iphoneos/Sample.app' )
76
+ # IMPORTANT: order needs to match labels in _SIZE_LABELS
74
77
return core_size , objc_size , boringssl_size , protobuf_size , app_size
75
78
76
79
@@ -87,6 +90,34 @@ def build(where, frameworks):
87
90
'src/objective-c/examples/Sample/Build/Build-%s' % where )
88
91
89
92
93
+ def _render_row (new , label , old ):
94
+ """Render row in 3-column output format."""
95
+ try :
96
+ formatted_new = '{:,}' .format (int (new ))
97
+ except :
98
+ formatted_new = new
99
+ try :
100
+ formatted_old = '{:,}' .format (int (old ))
101
+ except :
102
+ formatted_old = old
103
+ return '{:>15}{:>15}{:>15}\n ' .format (formatted_new , label , formatted_old )
104
+
105
+
106
+ def _diff_sign (new , old , diff_threshold = None ):
107
+ """Generate diff sign based on values"""
108
+ diff_sign = ' '
109
+ if diff_threshold is not None and abs (new_size [i ] -
110
+ old_size [i ]) >= diff_threshold :
111
+ diff_sign += '!'
112
+ if new > old :
113
+ diff_sign += '(>)'
114
+ elif new < old :
115
+ diff_sign += '(<)'
116
+ else :
117
+ diff_sign += '(=)'
118
+ return diff_sign
119
+
120
+
90
121
text = 'Objective-C binary sizes\n '
91
122
for frameworks in [False , True ]:
92
123
build ('new' , frameworks )
@@ -108,42 +139,38 @@ def build(where, frameworks):
108
139
subprocess .check_call (['git' , 'checkout' , where_am_i ])
109
140
subprocess .check_call (['git' , 'submodule' , 'update' , '--force' ])
110
141
111
- text += ('***************FRAMEWORKS****************\n '
112
- if frameworks else '*****************STATIC******************\n ' )
113
- row_format = "{:>10}{:>15}{:>15}" + '\n '
114
- text += row_format .format ('New size' , '' , 'Old size' )
142
+ text += ('********************FRAMEWORKS****************\n ' if frameworks
143
+ else '**********************STATIC******************\n ' )
144
+ text += _render_row ('New size' , '' , 'Old size' )
115
145
if old_size == None :
116
- for i in range (0 , len (size_labels )):
117
- text += ('\n ' if i == len (size_labels ) -
118
- 1 else '' ) + row_format .format ('{:,}' .format (new_size [i ]),
119
- size_labels [i ], '' )
146
+ for i in range (0 , len (_SIZE_LABELS )):
147
+ if i == len (_SIZE_LABELS ) - 1 :
148
+ # skip line before rendering "Total"
149
+ text += '\n '
150
+ text += _render_row (new_size [i ], _SIZE_LABELS [i ], '' )
120
151
else :
121
152
has_diff = False
122
- for i in range (0 , len (size_labels ) - 1 ):
123
- if abs (new_size [i ] - old_size [i ]) < diff_threshold :
124
- continue
125
- if new_size [i ] > old_size [i ]:
126
- diff_sign = ' (>)'
127
- else :
128
- diff_sign = ' (<)'
129
- has_diff = True
130
- text += row_format .format ('{:,}' .format (new_size [i ]),
131
- size_labels [i ] + diff_sign ,
132
- '{:,}' .format (old_size [i ]))
133
- i = len (size_labels ) - 1
134
- if new_size [i ] > old_size [i ]:
135
- diff_sign = ' (>)'
136
- elif new_size [i ] < old_size [i ]:
137
- diff_sign = ' (<)'
138
- else :
139
- diff_sign = ' (=)'
140
- text += ('\n ' if has_diff else '' ) + row_format .format (
141
- '{:,}' .format (new_size [i ]), size_labels [i ] + diff_sign ,
142
- '{:,}' .format (old_size [i ]))
153
+ # go through all labels but "Total"
154
+ for i in range (0 , len (_SIZE_LABELS ) - 1 ):
155
+ if abs (new_size [i ] - old_size [i ]) >= _DIFF_THRESHOLD :
156
+ has_diff = True
157
+ diff_sign = _diff_sign (new_size [i ],
158
+ old_size [i ],
159
+ diff_threshold = _DIFF_THRESHOLD )
160
+ text += _render_row (new_size [i ], _SIZE_LABELS [i ] + diff_sign ,
161
+ old_size [i ])
162
+
163
+ # render the "Total"
164
+ i = len (_SIZE_LABELS ) - 1
165
+ diff_sign = _diff_sign (new_size [i ], old_size [i ])
166
+ # skip line before rendering "Total"
167
+ text += '\n '
168
+ text += _render_row (new_size [i ], _SIZE_LABELS [i ] + diff_sign ,
169
+ old_size [i ])
143
170
if not has_diff :
144
171
text += '\n No significant differences in binary sizes\n '
145
172
text += '\n '
146
173
147
174
print (text )
148
175
149
- check_on_pr .check_on_pr ('Binary Size' , '```\n %s\n ```' % text )
176
+ check_on_pr .check_on_pr ('ObjC Binary Size' , '```\n %s\n ```' % text )
0 commit comments