comparison mercurial/ui.py @ 41308:26ee61c33dee stable

ui: remove unreachable branches and function calls from write() (issue6059) This is at least faster than ui.write() of 4.8.2. $ HGRCPATH=/dev/null hg files -R mozilla-central --time >/dev/null 4.8.2: time: real 2.340 secs (user 2.310+0.000 sys 0.020+0.000) 4.9rc0: time: real 2.580 secs (user 2.550+0.000 sys 0.020+0.000) this: time: real 2.230 secs (user 2.210+0.000 sys 0.020+0.000) Maybe the formatter should own a resolved write() function because it will just call dest.write(msg) most of the time, but that would be too much for stable.
author Yuya Nishihara <yuya@tcha.org>
date Thu, 24 Jan 2019 21:38:02 +0900
parents e8273eaa0726
children 876494fd967d
comparison
equal deleted inserted replaced
41307:e8273eaa0726 41308:26ee61c33dee
1000 a label of "status.modified" for modified files. 1000 a label of "status.modified" for modified files.
1001 ''' 1001 '''
1002 dest = self._fout 1002 dest = self._fout
1003 1003
1004 # inlined _write() for speed 1004 # inlined _write() for speed
1005 if self._buffers:
1006 label = opts.get(r'label', '')
1007 if label and self._bufferapplylabels:
1008 self._buffers[-1].extend(self.label(a, label) for a in args)
1009 else:
1010 self._buffers[-1].extend(args)
1011 return
1012
1013 # inliend _writenobuf() for speed
1014 self._progclear()
1015 msg = b''.join(args)
1016
1017 # opencode timeblockedsection because this is a critical path
1018 starttime = util.timer()
1019 try:
1020 if self._colormode == 'win32':
1021 # windows color printing is its own can of crab, defer to
1022 # the color module and that is it.
1023 color.win32print(self, dest.write, msg, **opts)
1024 else:
1025 if self._colormode is not None:
1026 label = opts.get(r'label', '')
1027 msg = self.label(msg, label)
1028 dest.write(msg)
1029 except IOError as err:
1030 raise error.StdioError(err)
1031 finally:
1032 self._blockedtimes['stdio_blocked'] += \
1033 (util.timer() - starttime) * 1000
1034
1035 def write_err(self, *args, **opts):
1036 self._write(self._ferr, *args, **opts)
1037
1038 def _write(self, dest, *args, **opts):
1039 # update write() as well if you touch this code
1005 if self._isbuffered(dest): 1040 if self._isbuffered(dest):
1006 label = opts.get(r'label', '') 1041 label = opts.get(r'label', '')
1007 if label and self._bufferapplylabels: 1042 if label and self._bufferapplylabels:
1008 self._buffers[-1].extend(self.label(a, label) for a in args) 1043 self._buffers[-1].extend(self.label(a, label) for a in args)
1009 else: 1044 else:
1010 self._buffers[-1].extend(args) 1045 self._buffers[-1].extend(args)
1011 return 1046 else:
1012 1047 self._writenobuf(dest, *args, **opts)
1013 # inliend _writenobuf() for speed 1048
1049 def _writenobuf(self, dest, *args, **opts):
1050 # update write() as well if you touch this code
1014 self._progclear() 1051 self._progclear()
1015 msg = b''.join(args) 1052 msg = b''.join(args)
1016 1053
1017 # opencode timeblockedsection because this is a critical path 1054 # opencode timeblockedsection because this is a critical path
1018 starttime = util.timer() 1055 starttime = util.timer()
1044 raise error.StdioError(err) 1081 raise error.StdioError(err)
1045 finally: 1082 finally:
1046 self._blockedtimes['stdio_blocked'] += \ 1083 self._blockedtimes['stdio_blocked'] += \
1047 (util.timer() - starttime) * 1000 1084 (util.timer() - starttime) * 1000
1048 1085
1049 def write_err(self, *args, **opts):
1050 self._write(self._ferr, *args, **opts)
1051
1052 def _write(self, dest, *args, **opts):
1053 # update write() as well if you touch this code
1054 if self._isbuffered(dest):
1055 label = opts.get(r'label', '')
1056 if label and self._bufferapplylabels:
1057 self._buffers[-1].extend(self.label(a, label) for a in args)
1058 else:
1059 self._buffers[-1].extend(args)
1060 else:
1061 self._writenobuf(dest, *args, **opts)
1062
1063 def _writenobuf(self, dest, *args, **opts):
1064 # update write() as well if you touch this code
1065 self._progclear()
1066 msg = b''.join(args)
1067
1068 # opencode timeblockedsection because this is a critical path
1069 starttime = util.timer()
1070 try:
1071 if dest is self._ferr and not getattr(self._fout, 'closed', False):
1072 self._fout.flush()
1073 if getattr(dest, 'structured', False):
1074 # channel for machine-readable output with metadata, where
1075 # no extra colorization is necessary.
1076 dest.write(msg, **opts)
1077 elif self._colormode == 'win32':
1078 # windows color printing is its own can of crab, defer to
1079 # the color module and that is it.
1080 color.win32print(self, dest.write, msg, **opts)
1081 else:
1082 if self._colormode is not None:
1083 label = opts.get(r'label', '')
1084 msg = self.label(msg, label)
1085 dest.write(msg)
1086 # stderr may be buffered under win32 when redirected to files,
1087 # including stdout.
1088 if dest is self._ferr and not getattr(self._ferr, 'closed', False):
1089 dest.flush()
1090 except IOError as err:
1091 if (dest is self._ferr
1092 and err.errno in (errno.EPIPE, errno.EIO, errno.EBADF)):
1093 # no way to report the error, so ignore it
1094 return
1095 raise error.StdioError(err)
1096 finally:
1097 self._blockedtimes['stdio_blocked'] += \
1098 (util.timer() - starttime) * 1000
1099
1100 def _writemsg(self, dest, *args, **opts): 1086 def _writemsg(self, dest, *args, **opts):
1101 _writemsgwith(self._write, dest, *args, **opts) 1087 _writemsgwith(self._write, dest, *args, **opts)
1102 1088
1103 def _writemsgnobuf(self, dest, *args, **opts): 1089 def _writemsgnobuf(self, dest, *args, **opts):
1104 _writemsgwith(self._writenobuf, dest, *args, **opts) 1090 _writemsgwith(self._writenobuf, dest, *args, **opts)