Các lập trình viên làm gì để tối ưu hóa micro cho ngày hôm nay? [đóng cửa]


14

Quay trở lại "những ngày tốt đẹp", khi chúng tôi sao chép phần mềm chia sẻ lên đĩa mềm cho bạn bè, chúng tôi cũng đã sử dụng một chút lắp ráp hợp lý. Có một thực tiễn chung về "tối ưu hóa vi mô", trong đó bạn sẽ nhìn chằm chằm và nhìn chằm chằm vào các dây chuyền lắp ráp cho đến khi bạn tìm ra cách để diễn đạt nó theo một hướng dẫn ít hơn. Thậm chí còn có một câu nói, về mặt toán học là không thể, rằng " Bạn luôn có thể loại bỏ thêm một lệnh nữa. " nỗ lực tối ưu hóa ở nơi khác?

Nói cách khác, một thực tiễn tốt nhất có thể được đưa đến một trạng thái cực đoan khi nó không còn thêm bất cứ thứ gì có giá trị? Và thay vào đó là lãng phí thời gian?

Ví dụ: Các lập trình viên có lãng phí thời gian để khái quát các phương thức riêng tư chỉ được gọi từ một nơi không? Là thời gian lãng phí giảm dữ liệu trường hợp thử nghiệm? Có phải các lập trình viên (vẫn) quá quan tâm đến việc giảm các dòng mã?

Có hai ví dụ tuyệt vời về những gì tôi đang tìm kiếm dưới đây: (1) Dành thời gian để tìm đúng tên biến, thậm chí đổi tên mọi thứ; và (2) Loại bỏ trùng lặp mã nhỏ và mười.


Lưu ý rằng điều này khác với câu hỏi " Bạn tối ưu hóa để làm gì? ", Bởi vì tôi đang hỏi những gì các lập trình viên khác dường như tối đa hóa, với sự kỳ thị của những điều này là tối ưu hóa "vi mô", và do đó không sử dụng thời gian hiệu quả.


Xem tại đây: lập trình
Robert Harvey

@Macneil, tôi không biết các lập trình viên khác tối ưu hóa vi mô để làm gì, nhưng tôi không có nhiều thời gian cho việc đó. Đồng nghiệp của tôi cũng bận rộn (Chỉ 2 xu của tôi).
Công việc

@Job: Bạn chưa bao giờ thấy ai đó lãng phí thời gian, thay đổi mã mà không có lý do? Tự coi mình là may mắn. Có hai ví dụ tuyệt vời dưới đây: Tên biến và sao chép mã nhỏ.
Macneil

1
Câu hỏi, như hiện tại, là một cải tiến. Tôi không thể xóa bỏ phiếu bầu gần, nhưng nó sẽ già đi sau vài ngày. Trên thực tế, câu hỏi đang thu hút một số câu trả lời khá tốt.
Robert Harvey

1
BTW, bất kỳ thực hành tốt nhất có thể được đưa đến mức cực đoan đến mức nó không còn tạo ra giá trị.
Robert Harvey

Câu trả lời:


22

Định dạng mã

Don't     get    me   wrong             ,
code      should be   consistent        & 
readable                                , 
but       some   take it         too far.

À đúng rồi, các loại biến cũ và tên biến cần các cột riêng trong một loạt các khai báo biến. Oh! Quên hàng thừa cho =và thứ tư cho người khởi tạo!
Macneil

[Darn, sẽ nâng cấp, nhưng đạt đến giới hạn hàng ngày của tôi ...]
Macneil

3
Các giáo sư của chúng tôi đã buộc chúng tôi định dạng mã cho các bài tập theo cách này. Mất tôi nhiều năm để bỏ thói quen này.
Oliver Weiler

Trời ơi. Về những câu trả lời khác, tôi đã cười, nhưng câu trả lời này thực sự rất đau :-(
Steve314

2
+1 Tôi đã từng làm việc với một thư viện nơi nhà phát triển từ chối làm cho mã của anh ta chính xác vì nó làm hỏng mã định dạng cột của anh ta ...
Dean Harding

20

Tôi đã từng viết rất nhiều trình biên dịch lại trong ngày. Không chỉ các trình biên dịch đã trở nên tốt hơn, mà hầu hết các phần cứng hiện nay đều có rất nhiều logic dành cho việc thực thi mã không theo thứ tự. Vấn đề vi mô thực sự là lên lịch, hầu hết các hướng dẫn máy tính đều mất vài đồng hồ máy để tạo ra kết quả - và tải bộ nhớ bị mất bộ nhớ cache có thể mất vài trăm! Vì vậy, ý tưởng là lên lịch các hướng dẫn khác để làm một cái gì đó hữu ích, thay vì chờ đợi một kết quả. Và máy móc hiện đại có thể đưa ra một số hướng dẫn cho mỗi khoảng thời gian. Khi chúng tôi bắt đầu thực hiện CTNH không theo thứ tự, tôi thấy rằng cố gắng để có được hiệu suất tuyệt vời với mã hóa tay đã trở thành một trò chơi cốc. Đầu tiên, CTNH không theo thứ tự sẽ không thực hiện các hướng dẫn theo thứ tự được làm cẩn thận của bạn, kiến trúc CTNH mới lạ mắt đã giảm hình phạt lập lịch phần mềm không tối ưu đủ để trình biên dịch thường nằm trong một vài phần trăm hiệu suất của bạn. Ngoài ra, tôi phát hiện ra rằng các trình biên dịch hiện đang thực hiện các thủ thuật tạo phổ biến nhưng phức tạp, chẳng hạn như không kiểm soát, tải dưới cùng, đường ống phần mềm, v.v ... Điểm mấu chốt, bạn phải làm việc thực sự khó khăn, bỏ qua một số thủ thuật này và trình biên dịch đánh bại bạn. Sử dụng tất cả chúng và số lượng hướng dẫn trình biên dịch bạn cần tăng gấp nhiều lần!

Có lẽ thậm chí quan trọng hơn, hầu hết các vấn đề về hiệu năng, không phải là về tỷ lệ vấn đề hướng dẫn, mà là đưa dữ liệu vào CPU. Như tôi đã đề cập ở trên, độ trễ bộ nhớ hiện có hàng trăm chu kỳ và CPU có thể thực thi một số lệnh trong mỗi chu kỳ đồng hồ, vì vậy trừ khi chương trình - và đặc biệt là các cấu trúc dữ liệu được thiết kế sao cho tốc độ nhấn bộ đệm quá cao, microtuning theo hướng dẫn cấp độ sẽ không có kết quả. Cũng giống như các loại quân đội nói chiến thuật nói chuyện nghiệp dư, nói chuyện hậu cần. Lập trình hiệu suất hiện là hơn 90% hậu cần (di chuyển dữ liệu). Và điều này rất khó để định lượng, vì quản lý bộ nhớ hiện đại thường có nhiều cấp độ bộ đệm và các trang bộ nhớ ảo được xử lý bởi một đơn vị phần cứng có tên là TLB. Ngoài ra, việc căn chỉnh địa chỉ lowlevel trở nên quan trọng, vì việc truyền dữ liệu thực tế, không tính theo đơn vị byte, hoặc thậm chí dài 64 bit, nhưng chúng có các đơn vị dòng bộ đệm. Sau đó, hầu hết các máy hiện đại đều có phần cứng cố gắng dự đoán dòng bộ nhớ cache nào bạn có thể cần trong tương lai gần và đưa ra các tìm nạp trước tự động để đưa chúng vào bộ đệm. Vì vậy, thực tế là với các mô hình hiệu năng CPU hiện đại rất phức tạp đến mức gần như không thể hiểu được. Ngay cả các trình giả lập phần cứng chi tiết cũng không bao giờ có thể khớp với logic chính xác của chip, vì vậy điều chỉnh chính xác đơn giản là không thể nữa.

Vẫn còn một nơi cho một số mã hóa tay. Các thư viện toán học (như hàm exp), cũng như các phép toán đại số tuyến tính quan trọng hơn (như nhân ma trận) vẫn thường được mã hóa bởi các chuyên gia làm việc cho nhà cung cấp phần cứng (ví dụ Intel hoặc AMD hoặc IBM), nhưng có lẽ chúng chỉ cần một vài lập trình viên trình biên dịch đỉnh cao trên mỗi máy tính siêu lớn.


1
Mã hóa bằng tay ngày càng khó khăn đối với những người làm việc bên ngoài các nhà cung cấp CPU, vì nhiệm vụ ngày càng phụ thuộc vào kiến ​​thức nội bộ và các công cụ cụ thể của nhà cung cấp (trình biên dịch và trình biên dịch). xoắn ốc cố gắng mô hình hóa tối ưu hóa CPU và tự động tìm kiếm các giải pháp tối ưu.
rwong

Nhiều ngôn ngữ máy tính đẩy các lập trình viên đến mức tối ưu hóa vi mô một cách vô lý bằng cách khiến cho việc sử dụng độ chính xác gấp đôi cho các tính toán có kết quả sẽ được đưa vào float. Vì một số lý do tôi không thể hiểu được, nhiều người thấy rằng đây là một điều tốt.
supercat

10

Đôi khi tôi dành thời gian (lãng phí?) Trong khi chọn một tên hay cho một biến hoặc một phương thức để nó không chỉ mô tả chính xác mà còn có một phong cách ngôn ngữ tốt.

Nó đi xa hơn một chút khi tôi cố gắng đưa toàn bộ tác phẩm (một chương trình) vào cùng một phong cách ngôn ngữ. Đôi khi ý kiến ​​của tôi thay đổi và tôi sửa lại cuốn sách. :)

Không, nó mất nhiều thời gian Nó khá hiếm. Nhưng tôi thích giữ ngữ pháp tốt trong các chương trình của mình.


3
Đặt tên là khó. Do đó, bạn nên cấu trúc lại tên khi bạn nghĩ ra một cái tốt hơn nhiều. Lưu ý rằng điều này nắm bắt nỗ lực tâm trí và hy vọng kết tinh "tại sao" quá.

1
Đây thực sự là một thứ não trái (phía bên trái não của bạn chịu trách nhiệm xử lý ngôn ngữ). Là một lập trình viên não phải, tôi có xu hướng dành ít thời gian hơn để lo lắng về ngữ nghĩa và nhiều thời gian hơn để lo lắng về việc làm thế nào tất cả các phần khớp với nhau.
Jason Baker

7
Biến và đặt tên phương thức là một phần quan trọng của khả năng bảo trì. Người ta nên dành thời gian suy nghĩ về tên, để 5 năm nữa, người duy trì mã có thời gian dễ dàng hơn với nó.
GrandmasterB

@grandmaster: Không thể đồng ý nhiều hơn.
Robert Harvey

4
@ não phải: Vui lòng mã cho lef-tbrainers, vì vậy tôi cũng có thể đọc mã của bạn
Juan Mendes

10

Thời gian phức tạp. Tôi dành quá nhiều thời gian để tối ưu hóa mọi thứ cho hiệu suất trong trường hợp xấu nhất ở quy mô lớn hơn so với bất cứ điều gì tôi biết chương trình sẽ thực sự gặp phải.

Tôi quá ám ảnh khi buông tay 'nhưng nó có thể phát triển xương lớn' đó, ngay cả khi các quyết định thiết kế khác ngăn cản điều đó xảy ra thực tế.

Tuy nhiên, để bảo vệ tôi, nếu điều phi thực tế trở thành hiện thực .. việc tối ưu hóa thực sự không còn là "vi mô" nữa. Lưu ý, tôi đã không nói không thể , nhưng không thực tế .

Tất nhiên, các yêu cầu được ưu tiên.


1
Tôi làm việc cho một công ty bị chìm vì điều này.
Henry

2
@Henry - Tôi hứa, đó không phải là tôi :)
Tim Post

1
@Henry: Bạn có nghĩa là họ lãng phí thời gian tối ưu hóa cho những điều mà có thể sẽ không bao giờ xảy ra, hoặc họ không suy nghĩ về những điều mà có khả năng sẽ "không bao giờ" xảy ra ... cho đến khi họ đã xảy ra và nó đã quá muộn?
Dean Harding

2
@Henry: Nếu một công ty có một sản phẩm có khả năng mở rộng cao và vẫn bị chìm, đó là lỗi bán hàng và tiếp thị (vì không nhắm mục tiêu khách hàng số lượng lớn và không định giá phù hợp), không phải là sự phát triển.
rwong

1
Công ty đã dành quá nhiều thời gian để thiết kế một hệ thống cho hàng triệu người dùng khi họ không có 1 người dùng. Nó phải có lỗi thị trường. Vâng, hãy đổ lỗi cho tiếp thị, những kẻ đó là những kẻ ngốc.
Henry

8

Tôi nghĩ rằng tôi đã lãng phí hàng tuần thời gian để xử lý các trình xử lý ngoại lệ Java.

Đây là rất nhiều công việc cho mã mà thất bại hai hoặc ba lần mỗi năm. Đây nên là một cảnh báo hoặc một thông tin? Lỗi hay tử vong? Có thực sự gây tử vong là quá trình sẽ được sinh ra trong năm phút? Có thực sự là một cảnh báo nếu mọi thứ vẫn ở trạng thái mặc định?

Rất nhiều ánh mắt và thảo luận về bản chất của lỗi IO. Nếu bạn không thể đọc tệp qua mạng, đó là lỗi tệp hay lỗi mạng? Và như thế.

Tại một thời điểm, tôi đã thay thế tất cả các chuỗi concat bằng String.formatlỗi tệp hàng năm không dẫn đến các đối tượng bổ sung trong heap. Đó là một sự lãng phí.


3
Đây là công việc quan trọng. Giá của thất bại = thông báo lỗi của bạn được nêu trên WTF hàng ngày.
Steve314

7

Tôi cho rằng tôi quan tâm đến LỘC quá nhiều. Bản thân không quá nhiều LỘC, mà là số lượng câu lệnh và số câu lệnh trùng lặp nhiều hơn. Tôi dị ứng với mã trùng lặp. Nói chung, tôi thích tái cấu trúc, nhưng tôi cho rằng khoảng 50% những gì tôi làm không làm cho mã đẹp hơn một cách rõ rệt.


4
+1 cho "Tôi bị dị ứng với mã trùng lặp". Xem thêm câu trả lời của tôi tại đây: lập trình
viên.stackexchange.com / questions / 14610 / Giả

Suy nghĩ về nó - Tôi có vấn đề này với các vòng lặp liên quan đến một điểm Knuth đã thực hiện về goto và đôi khi phải giao dịch một hoặc hai hoặc một số mã trùng lặp để viết mã có cấu trúc. Tôi sẽ sử dụng một goto trong các trường hợp rất hiếm (phổ biến nhất = mã được tạo), nhưng biến thể của rối loạn này là lãng phí thời gian và lo lắng với một vòng lặp cố gắng để loại bỏ một sự không hiệu quả tầm thường mà vẫn giữ được mã.
Steve314

5

Đọc một dòng tệp theo từng dòng thay vì chỉ đọc toàn bộ dòng thành một chuỗi và xử lý chuỗi trong một lần.

Chắc chắn, nó tạo ra sự khác biệt về tốc độ thực thi nhưng hiếm khi có giá trị của các dòng mã bổ sung. Nó làm cho mã ít được bảo trì hơn và tăng kích thước mã.

Có, điều này có thể không có ý nghĩa nếu tệp lớn 3 GB nhưng hầu hết các tệp không lớn (ít nhất không phải là tệp tôi đang làm việc với ;-)).


3
Ngay cả khi nó là 3 GB trở lên, một máy 64 bit có thể xử lý nó bằng bộ nhớ ảo. Sử dụng tệp ánh xạ bộ nhớ và nó thậm chí sẽ không đọc bất kỳ phần nào của tệp cho đến khi cần. Nhắc bạn, thậm chí đó là tối ưu hóa vi mô trong trường hợp bình thường.
Steve314

3

Khi tôi đang viết ngôn ngữ lắp ráp, nó có ý nghĩa đối với nitpick qua byte và chu kỳ, nhưng đó là một thời gian dài trước đây và trình biên dịch đã đi một chặng đường dài kể từ đó. Bây giờ tôi sẽ không cố gắng tối ưu hóa thủ công.

Tương tự như vậy, khi tôi chuyển sang viết bằng C, việc thực hiện công việc tốt hơn so với trình biên dịch C là khá dễ dàng, nhưng mỗi năm Borland hoặc Microsoft hoặc ai đó sẽ phát hành một công cụ cải tiến mới đã phát triển một công cụ trước đó xung quanh phòng. Tôi bắt đầu chú ý đến mã lắp ráp thực tế mà trình biên dịch đang phát ra và, thật nguy hiểm nếu nó không viết một số mã đẹp và chặt chẽ, các vòng lặp không kiểm soát, di chuyển các biến bên ngoài các vòng lặp, v.v.

Ngày nay tôi đang viết bằng nhiều ngôn ngữ cao hơn như Perl, Python và Ruby. Tôi sử dụng một số thủ thuật trình biên dịch lên phía trước, như không kiểm soát vòng lặp nếu nó có ý nghĩa, di chuyển các biến tĩnh bên ngoài các vòng lặp, v.v., nhưng tôi không lo lắng về điều đó gần như vì CPU bây giờ nhanh hơn một chút. Nếu một ứng dụng dường như bị kéo bất ngờ thì tôi sẽ sử dụng một trình lược tả và xem những gì tôi có thể tìm thấy, và sau đó nếu có thể cải thiện điều gì đó, tôi sẽ bắt đầu đo điểm chuẩn theo nhiều cách khác nhau để làm gì đó nhanh hơn, và sau đó xem cách nó vảy lên.

Nói chung, tôi cố gắng thông minh về cách tôi viết mã, dựa trên nhiều năm kinh nghiệm.


Xin chào Greg, cảm ơn vì câu trả lời, nhưng tôi đang tìm kiếm những gì lập trình viên làm để lãng phí thời gian, không phải để tối ưu hóa hiệu năng thời gian chạy. Có hai ví dụ tuyệt vời ở trên: Tên biến và loại bỏ ngay cả sao chép mã nhỏ.
Macneil

3

Tối ưu hóa vi mô: cải thiện hiệu suất đơn luồng của những thứ có thể song song hoặc đơn giản có thể được cải thiện với phần cứng mới.

Nếu một cái gì đó chậm trên máy tính từ 10 năm trước, một giải pháp rẻ hơn có lẽ là mua một máy tính mới hơn, nhanh hơn, thay vì lãng phí thời gian của lập trình viên. Tuy nhiên, một trọng tâm lớn của việc tối ưu hóa được cân nhắc là tìm cách sử dụng 8 lõi mà bạn có thể có được ngày hôm nay, hoặc 64 bạn sẽ có thể có được trong một vài năm, thay vì đau đớn về những chi tiết vụn vặt như chi phí rác thải thêm bộ sưu tập.


2

Tối ưu hóa vi mô về hiệu suất thời gian chạy hầu như không phải là một vấn đề khép kín ngay cả ngày nay (mặc dù nó có thể ít phổ biến hơn). Thỉnh thoảng tôi phải giải thích với mọi người rằng chi phí phân bổ một đối tượng bổ sung mỗi yêu cầu hoặc thêm một lệnh gọi chức năng bổ sung là không đáng kể.

Bên cạnh đó, tôi cũng thấy các lập trình viên tối ưu hóa vi mô cho đơn giản (bao gồm cả bản thân tôi). Tôi vẫn chưa làm việc ở đâu đó mà tôi không phải giải thích sự khác biệt giữa đơn giản và đơn giản.


Tại sao lập trình viên. có gì khác không? Sự khác biệt là gì, xin vui lòng.
Dan Rosenstark

@Yar - Tại sao các lập trình viên sẽ khác với những gì?
Jason Baker

tại sao sẽ programmers.= programmers.stackexchange.comkhác với mọi nơi bạn từng làm việc mà bạn phải giải thích sự khác biệt giữa hai khái niệm này? Hãy giải thích sự khác biệt.
Dan Rosenstark

@Yar - Tôi không biết rằng nó sẽ. Trong thực tế, như quan điểm của các lập trình viên. Là để giúp các lập trình viên nắm bắt kiến ​​thức, tôi sẽ hy vọng rằng điều đó không khiến mọi người có thể ít nhất được giác ngộ một chút bởi câu trả lời của tôi.
Jason Baker

2
Vì vậy, sự khác biệt b / t đơn giản và đơn giản là gì?
Dan Rosenstark

2

Tôi là tất cả cho nguyên tắc không tối ưu hóa-trừ khi thực sự cần thiết. Và tôi là tất cả cho nguyên tắc đầu tiên hồ sơ. Và về nguyên tắc, tôi sẽ chỉ tối ưu hóa một cái gì đó sẽ tạo ra sự khác biệt cần thiết.

Đó là về nguyên tắc. Nhưng nguyên tắc là một kẻ nói dối.

Tôi có thói quen quan tâm đến các chức năng trong các thư viện được sử dụng thường xuyên mà tôi nghĩ sẽ được sử dụng rất nhiều trong các vòng lặp bên trong. Và sau đó, khi bạn phát hiện ra thứ gì đó trong một chức năng khác, nó không được sử dụng thường xuyên ...

Ồ - và sau đó là logic "Tôi đang viết nó - tất nhiên đó là một thư viện quan trọng".

Ồ - và BTW. Tôi chưa bao giờ sử dụng một hồ sơ để hướng dẫn tối ưu hóa. Không có quyền truy cập vào một thương mại và không bao giờ xây dựng được động lực để tìm ra gprof.

Về cơ bản, tôi là một kẻ đạo đức giả. Những nguyên tắc này áp dụng cho người khác, nhưng tôi quá sợ ai đó nói "nhưng tại sao bạn lại viết nó theo cách chậm chạp và nhảm nhí?" Vì vậy, tôi không bao giờ có thể thực sự áp dụng chúng đúng cách cho bản thân mình.

Tôi thực sự không tệ như tôi làm ở đây. Và tôi hoàn toàn miễn nhiễm với sự tự lừa dối bản thân, vì vậy bạn biết tôi đúng về điều đó!

BIÊN TẬP

Tôi nên thêm - một trong những trò chơi ngu ngốc chính của tôi là tổng phí cuộc gọi. Tất nhiên không phải ở khắp mọi nơi, nhưng trong những trường hợp tôi nghĩ rằng nó sẽ được sử dụng rất nhiều trong các vòng lặp (trong đó tôi không có bằng chứng khách quan về vấn đề). Tôi đã viết mã dựa trên offset khó chịu để tránh thực hiện các cuộc gọi phương thức ảo nhiều lần. Kết quả thậm chí có thể chậm hơn, vì có lẽ đó không phải là một phong cách mã hóa mà các trình tối ưu hóa được thiết kế để đối phó tốt - nhưng nó thông minh hơn ;-)


+1 À, vâng! Lớp này phân tích cú pháp các đối số dòng lệnh rất cụ thể và kỳ quặc của ứng dụng của tôi, nhưng hãy để tôi định dạng và ghi lại đầy đủ khi Javadoc, bởi vì chắc chắn những người khác sẽ sử dụng điều này trong nhiều năm! [Sẽ cần nâng cấp sau, đạt đến giới hạn hàng ngày của tôi.]
Macneil

@Macneil - đó là Doxygen, tôi sẽ biết. Với mọi tùy chọn tôi có thể tìm thấy được bật, vì vậy mọi chức năng nhỏ sẽ được "ghi lại" chi tiết, hoàn chỉnh với hàng tá biểu đồ GraphViz đẹp. Thực sự giúp mọi người đánh giá cao tầm quan trọng của mã của tôi - và bản in ra có thể hình nền cho một khối văn phòng lớn.
Steve314

1

Vào thời xa xưa khi máy tính có thời gian đồng hồ đo bằng micro giây, bộ nhớ được đo bằng kilobyte và trình biên dịch nguyên thủy, tối ưu hóa vi mô có ý nghĩa.

Tốc độ và kích thước của các máy tính thế hệ hiện tại và chất lượng của các trình biên dịch thế hệ hiện tại có nghĩa là tối ưu hóa vi mô thường là một sự lãng phí toàn bộ thời gian. Các ngoại lệ có xu hướng là khi bạn hoàn toàn phải đạt được hiệu suất tối đa từ một số mã chuyên sâu tính toán ... hoặc bạn đang viết cho một hệ thống nhúng với tài nguyên cực kỳ hạn chế.

nhưng tôi đang tìm kiếm những gì lập trình viên làm để lãng phí thời gian, không phải để tối ưu hóa hiệu năng thời gian chạy.

Twitter và Facebook mùa xuân đến trong tâm trí :-)


Xin chào Stephen, đó là một bình luận tuyệt vời về tối ưu hóa vi mô, nhưng bạn có thấy bất kỳ tương đương hiện đại nào không? [Facebook và Twitter không phải là "thực tiễn tốt nhất" có thể được mang đi quá xa.]
Macneil

Nó vẫn có ý nghĩa. Thời gian của đồng hồ có thể là các đơn đặt hàng có cường độ nhỏ hơn, nhưng mã là các đơn đặt hàng có cường độ lớn hơn ...
hplbsh

@Stuart - điều đó có nghĩa là có các đơn đặt hàng mã lớn hơn để tối ưu hóa vi mô ... mà đơn giản là không mở rộng quy mô.
Stephen C
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.