Mercurial > hg
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) |