Tại sao (điểm tối thiểu) phổ biến hơn 1?


16

Tôi đã tìm kiếm trên tất cả các tệp Lisp của Emacs trong repo Emacs Git và thấy (goto-char (point-min))xảy ra 3621 lần và (goto-char 1)xảy ra 31 lần. Cá nhân, tôi thấy rất nhiều (point-min)nhưng không 1, thậm chí trong nhiều trường hợp, chắc chắn 100% rằng khu vực này không bị thu hẹp. Vì vậy, đây là câu hỏi của tôi: (point-min)vẫn được ưa thích hơn 1ngay cả trong bộ đệm không bị thu hẹp?

Tôi đoán 1là nhanh hơn (point-min), không có nghĩa là nó nhẹ như thế nào, bởi vì 1không đổi trong khi (point-min)là một cuộc gọi chức năng. Bên cạnh đó, 1ngắn hơn nhiều so với (point-min), 1 ký tự so với 11 ký tự.


2
Bạn có thể cung cấp một ví dụ trong đó "chắc chắn 100% rằng khu vực này không bị thu hẹp '? Tôi đoán bạn có nghĩa là ngay sau khi mở rộng? Đó có thực sự là" nhiều trường hợp "không?
Omar

1
Tôi luôn nghĩ bộ đệm bắt đầu từ 0 ...
Omair Majid

Câu trả lời:


28

Làm thế nào để bạn biết rằng bộ đệm không bị thu hẹp?

Trừ khi bạn đã mở rộng nó ngay trước khi bạn gọi hàm, bạn không thể chắc chắn. Hơn nữa, "phần mềm tuyệt vời" thường được định nghĩa là "được sử dụng theo cách mà tác giả chưa bao giờ hình dung" - vì vậy người ta phải luôn chuẩn bị cho việc sử dụng mã của một người bất thường.

Mã dễ đọc là King

Khi bạn viết (goto-char 1), người đọc mã (bao gồm cả bạn 6 tháng sau) sẽ dành tư duy trí tuệ quý giá

  • "làm thế nào để chúng ta biết bộ đệm không bị thu hẹp?" và
  • "là ký tự đầu tiên 0 hay 1?"

Về cơ bản, trừ khi bạn có (widen)quyền trước đó, bạn cần một bình luận giải thích lý do tại sao bạn tự tin bộ đệm không bị thu hẹp.

Chi phí là không đáng kể

Trừ khi bạn đã lập hồ sơ mã của bạn và tìm thấy khác, một giả định an toàn là chi phí ở đây sẽ không đáng kể. So với tất cả những thứ khác ELisp làm (mạng, truy cập đĩa, thậm chí khớp chuỗi), (point-min)sẽ không có chi phí có ý nghĩa (và thậm chí có thể rẻ hơn , xem câu trả lời của Stefan).


2
+1, đặc biệt là để nhấn mạnh việc sử dụng có thể theo những cách không mong muốn và có thể tái sử dụng trong các bối cảnh khác. Một hàm sử dụng point-minthường chung chung hơn một hàm sử dụng 1- nó thường có thể hoạt động cho dù vùng đó có bị thu hẹp hay không.
vẽ

19

Để bổ sung cho câu trả lời của sds (mà tôi hoàn toàn đồng ý), mặc dù có vẻ ngoài, (point-min)có thể hiệu quả hơn 1. Về tốc độ thực hiện, các thử nghiệm của tôi không thấy bất kỳ sự khác biệt có thể đo lường nào, nhưng về kích thước:

ELISP> (byte-compile '(lambda () (goto-char (point-min))))
#[nil "eb\207" [] 1]

ELISP> (byte-compile '(lambda () (goto-char 1)))
#[nil "\300b\207" [1] 1]

ELISP> 

Đó là bởi vì point-mincó mã byte riêng và do đó được mã hóa và thực thi rất hiệu quả so với các lệnh gọi hàm khác.

Tất nhiên, một lý do khác để tôi sử dụng point-minlà tôi coi sự lựa chọn lịch sử 1là một sai lầm (bộ đệm nên đã bắt đầu từ 0).


1
Lý do bạn đưa ra chỉ là mã byte cho point-minnhỏ hơn một chút? Có vẻ như một lý do khá nhạt nhẽo. Tại sao lại coi trọng điều đó? Hoặc có thể câu trả lời của bạn thực sự có ý nghĩa như một bình luận , để chỉ sửa giả định rằng cái này có hiệu suất cao hơn cái kia hoặc 1dẫn đến mã byte nhỏ hơn?
vẽ
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.