Làm cách nào để Windows chạy nhanh như Linux để biên dịch C ++?


142

Tôi biết đây không phải là một câu hỏi lập trình nhiều nhưng nó có liên quan.

Tôi làm việc trên một dự án đa nền tảng khá lớn . Trên Windows tôi sử dụng VC ++ 2008. Trên Linux tôi sử dụng gcc. Có khoảng 40k tệp trong dự án. Windows chậm hơn từ 10 đến 40 lần so với Linux khi biên dịch và liên kết cùng một dự án. Lam sao tôi co thể sửa no?

Một thay đổi gia tăng duy nhất xây dựng 20 giây trên Linux và> 3 phút trên Windows. Tại sao? Tôi thậm chí có thể cài đặt trình liên kết 'vàng' trong Linux và giảm thời gian đó xuống còn 7 giây.

Tương tự git nhanh hơn gấp 10 đến 40 lần trên Linux so với Windows.

Trong trường hợp git, git có thể không sử dụng Windows theo cách tối ưu mà là VC ++? Bạn nghĩ rằng Microsoft sẽ muốn làm cho các nhà phát triển của riêng họ làm việc hiệu quả nhất có thể và việc biên dịch nhanh hơn sẽ đi một chặng đường dài. Có lẽ họ đang cố gắng khuyến khích các nhà phát triển vào C #?

Như thử nghiệm đơn giản, tìm một thư mục có nhiều thư mục con và thực hiện đơn giản

dir /s > c:\list.txt

trên Windows. Làm điều đó hai lần và lần thứ hai để nó chạy từ bộ đệm. Sao chép các tệp vào Linux và thực hiện 2 lần chạy tương đương và thời gian chạy lần thứ hai.

ls -R > /tmp/list.txt

Tôi có 2 máy trạm với cùng thông số kỹ thuật. HP Z600 với 12g ram, 8 nhân tốc độ 3.0ghz. Trên một thư mục có ~ 400k tệp Windows mất 40 giây, Linux mất <1 giây.

Có cài đặt đăng ký nào tôi có thể thiết lập để tăng tốc Windows không? Đưa cái gì?


Một vài liên kết hơi liên quan, liên quan đến thời gian biên dịch, không nhất thiết phải là i / o.


5
Tôi không biết tại sao, nhưng đây là một sự khác biệt đã biết về các đặc tính hiệu năng của Windows và Linux, Linux tốt hơn so với các cửa sổ trong việc xử lý vô số tệp trong một thư mục, có thể chỉ là NTFS so với ext4 / sao? Cũng có thể là Windows tương đương với bộ nhớ cache của Linux không tốt bằng.
Spudd86

73
Tại sao điều này đã bị đóng cửa? "Không mang tính xây dựng" ??! Tôi thấy nó khá phù hợp cho các nhà phát triển.
Nils

3
Câu hỏi này không bao gồm các sự kiện và có thể được hỗ trợ bởi bất kỳ số lượng sự kiện, tài liệu tham khảo, bất cứ điều gì. Chỉ nghĩ rằng một tiêu đề có vẻ gây tranh cãi không nên ngăn chúng ta thảo luận về một vấn đề lâu dài nhưng không đủ nói về vấn đề này. Là một người dùng Windows lâu năm, tôi muốn hỏi câu hỏi này và hy vọng nhận được một số câu trả lời hữu ích bất cứ lúc nào. Vui lòng mở lại câu hỏi trừ khi bạn có thể cung cấp bằng chứng thực tế rằng câu hỏi vốn dĩ là tranh luận và không được hỗ trợ bởi các sự kiện. Nếu không, bạn chỉ là một người điều hành.
Halil Özgür

2
@ HalilÖzgür: OK, nhận xét của bạn đã nhắc tôi xem lịch sử sửa đổi - tiêu đề câu hỏi ban đầu hỏi một cái gì đó như thế. Điều đó có thể rất tốt đã được lý do (Tôi không bỏ phiếu để đóng), vì có được một bài đăng bởi một ai đó xúc phạm rõ ràng bởi các tiêu đề ban đầu và bắt đầu hoành hành, mà sau đó đã bị xóa, dẫn đến việc đóng cửa của câu hỏi này. Tiêu đề đã được chỉnh sửa kể từ đó, vì vậy tôi nghĩ rằng chúng tôi tốt để đi. Mở lại. Hãy nhớ rằng bạn vẫn nên cố gắng không thảo luận về câu hỏi ... vì OP đang tìm kiếm câu trả lời, cung cấp câu trả lời, không có gì khác.
BoltClock

2
Thật tuyệt vời khi thấy ai đó như @ raymond-chen chime với một số hiểu biết - nếu câu hỏi vẫn mang tính kỹ thuật và cung cấp dữ liệu / sự kiện đủ rõ ràng để tái tạo vấn đề.
Benjamin Podszun

Câu trả lời:


32

Trừ khi có một hacker hệ thống Windows khó tính xuất hiện, bạn sẽ không nhận được nhiều hơn những bình luận đảng phái (mà tôi sẽ không làm) và suy đoán (đó là những gì tôi sẽ thử).

  1. Hệ thống tệp - Bạn nên thử các thao tác tương tự (bao gồm dir) trên cùng một hệ thống tệp. Tôi đã xem qua cái này điểm chuẩn một vài hệ thống tập tin cho các tham số khác nhau.

  2. Bộ nhớ đệm. Tôi đã từng thử chạy một trình biên dịch trên Linux trên một đĩa RAM và thấy rằng nó chậm hơn so với việc chạy nó trên đĩa nhờ vào cách nhân xử lý bộ nhớ đệm. Đây là một điểm bán hàng vững chắc cho Linux và có thể là lý do tại sao hiệu suất rất khác nhau.

  3. Thông số kỹ thuật phụ thuộc xấu trên Windows. Có thể các thông số kỹ thuật phụ thuộc crom cho Windows không chính xác như đối với Linux. Điều này có thể dẫn đến các phần tổng hợp không cần thiết khi bạn thực hiện một thay đổi nhỏ. Bạn có thể xác thực điều này bằng cách sử dụng cùng chuỗi công cụ biên dịch trên Windows.


Bạn có thể xây dựng một chút về # 2? Điều này khá đáng ngạc nhiên - có phải vì kernel không lưu trữ dữ liệu trên đĩa RAM hay không?
dùng541686

2
Nếu bạn phân bổ một phần của bộ nhớ dưới dạng ramdisk, thì nó không có sẵn cho kernel để lưu vào bộ nhớ cache hoặc sử dụng cho bất cứ điều gì khác. Thực tế, bạn đang vặn tay và buộc nó sử dụng ít bộ nhớ hơn cho các thuật toán riêng của mình. Kiến thức của tôi là kinh nghiệm. Tôi đã mất hiệu suất khi tôi sử dụng RAMdisk cho các phần tổng hợp.
Noufal Ibrahim

1
"Trừ khi [một chuyên gia về một chủ đề cụ thể] xuất hiện, bạn sẽ không nhận được nhiều hơn những bình luận đảng phái ... và suy đoán": nó khác với bất kỳ câu hỏi nào khác?
Dolph

1
Điều này, nhờ vào chủ đề Win vs Lin là một nam châm fanboy. Ngoài ra, câu hỏi khá sắc thái không giống như những câu hỏi trực tiếp chỉ yêu cầu các lệnh hoặc phương thức sử dụng.
Noufal Ibrahim

Liên kết trong # 1 không còn hoạt động.
kiềm

28

Một vài ý tưởng:

  1. Vô hiệu hóa 8.3 tên. Đây có thể là một yếu tố lớn trên các ổ đĩa có số lượng tệp lớn và số lượng thư mục tương đối nhỏ:fsutil behavior set disable8dot3 1
  2. Sử dụng nhiều thư mục hơn. Theo kinh nghiệm của tôi, NTFS bắt đầu chậm lại với hơn 1000 tệp cho mỗi thư mục.
  3. Cho phép xây dựng song song với MSBuild; chỉ cần thêm công tắc "/ m" và nó sẽ tự động bắt đầu một bản sao MSBuild trên mỗi lõi CPU.
  4. Đặt các tệp của bạn vào ổ SSD - giúp ích rất nhiều cho I / O ngẫu nhiên.
  5. Nếu kích thước tệp trung bình của bạn lớn hơn 4KB, hãy xem xét xây dựng lại hệ thống tệp với kích thước cụm lớn hơn tương ứng với kích thước tệp trung bình của bạn.
  6. Hãy chắc chắn rằng các tập tin đã được phân mảnh. Các tệp bị phân mảnh gây ra rất nhiều tìm kiếm đĩa, có thể khiến bạn phải trả hơn 40 lần thông lượng. Sử dụng tiện ích "contig" từ sysiternals hoặc trình chống phân mảnh Windows tích hợp.
  7. Nếu kích thước tệp trung bình của bạn nhỏ và phân vùng bạn đang sử dụng tương đối đầy đủ, có thể bạn đang chạy với một MFT bị phân mảnh, điều này không tốt cho hiệu suất. Ngoài ra, các tệp nhỏ hơn 1K được lưu trữ trực tiếp trong MFT. Tiện ích "contig" được đề cập ở trên có thể giúp ích hoặc bạn có thể cần tăng kích thước MFT. Lệnh sau sẽ nhân đôi nó, thành 25% âm lượng: fsutil behavior set mftzone 2Thay đổi số cuối cùng thành 3 hoặc 4 để tăng kích thước theo mức tăng thêm 12,5%. Sau khi chạy lệnh, khởi động lại và sau đó tạo hệ thống tập tin.
  8. Vô hiệu hóa thời gian truy cập cuối cùng: fsutil behavior set disablelastaccess 1
  9. Vô hiệu hóa dịch vụ lập chỉ mục
  10. Vô hiệu hóa phần mềm chống vi-rút và chống phần mềm gián điệp hoặc ít nhất đặt các thư mục có liên quan bị bỏ qua.
  11. Đặt các tệp của bạn trên một ổ đĩa vật lý khác với HĐH và tệp hoán trang. Sử dụng một ổ đĩa vật lý riêng biệt cho phép Windows sử dụng I / O song song cho cả hai ổ đĩa.
  12. Có một cái nhìn vào cờ biên dịch của bạn. Trình biên dịch Windows C ++ có rất nhiều tùy chọn; đảm bảo bạn chỉ sử dụng những thứ bạn thực sự cần.
  13. Hãy thử tăng dung lượng bộ nhớ mà HĐH sử dụng cho bộ đệm paged-pool (đảm bảo bạn có đủ RAM trước): fsutil behavior set memoryusage 2
  14. Kiểm tra nhật ký lỗi Windows để đảm bảo bạn không gặp phải lỗi đĩa thường xuyên.
  15. Hãy xem các bộ đếm hiệu suất liên quan đến Đĩa vật lý để xem các ổ đĩa của bạn bận như thế nào. Độ dài hàng đợi cao hoặc thời gian dài cho mỗi lần chuyển là những dấu hiệu xấu.
  16. 30% phân vùng đĩa đầu tiên nhanh hơn nhiều so với phần còn lại của đĩa về thời gian truyền thô. Phân vùng hẹp hơn cũng giúp giảm thiểu thời gian tìm kiếm.
  17. Bạn đang sử dụng RAID? Nếu vậy, bạn có thể cần tối ưu hóa lựa chọn loại RAID của mình (RAID-5 không tốt cho các hoạt động nặng như ghi)
  18. Vô hiệu hóa bất kỳ dịch vụ nào bạn không cần
  19. Thư mục chống phân mảnh: sao chép tất cả các tệp vào ổ đĩa khác (chỉ các tệp), xóa các tệp gốc, sao chép tất cả các thư mục sang ổ đĩa khác (chỉ các thư mục trống), sau đó xóa các thư mục gốc, chống phân mảnh ổ đĩa gốc, sao chép lại cấu trúc thư mục , sau đó sao chép các tập tin. Khi Windows xây dựng các thư mục lớn một tệp tại một thời điểm, các thư mục cuối cùng sẽ bị phân mảnh và chậm. ("contig" cũng sẽ giúp ở đây)
  20. Nếu bạn bị ràng buộc I / O và có chu kỳ CPU dự phòng, hãy thử BẬT đĩa nén. Nó có thể cung cấp một số tăng tốc đáng kể cho các tệp có khả năng nén cao (như mã nguồn), với một số chi phí trong CPU.

1
Ngay cả khi bạn đã làm tất cả những điều này, bạn sẽ không đến gần với sự hoàn hảo của Linux. Làm bài kiểm tra dưới đây thử và đăng thời gian của bạn nếu bạn không đồng ý.
b7kich

6
Chúng tôi cần một điểm chuẩn tốt hơn. Đo thời gian để liệt kê một thư mục không phải là một IMO rất hữu ích. NTFS được tối ưu hóa cho thời gian tra cứu tập tin đơn, với cấu trúc btree. Trong Linux (lần cuối tôi nhìn), một ứng dụng có thể đọc toàn bộ thư mục với một cuộc gọi hệ thống duy nhất và lặp lại qua cấu trúc kết quả hoàn toàn bằng mã người dùng; Windows yêu cầu một cuộc gọi sys riêng cho mỗi tệp. Dù bằng cách nào, trình biên dịch không cần phải đọc toàn bộ thư mục ....
RickNZ

3
Sau đó, những gì bạn đang mô tả chính xác là vấn đề. Chọn một điểm chuẩn khác nhau không giải quyết được vấn đề - bạn chỉ đang nhìn đi chỗ khác.
b7kich

2
Câu hỏi là về tối ưu hóa thời gian biên dịch. Thời gian liệt kê thư mục không chi phối thời gian biên dịch trên Windows, ngay cả với hàng chục ngàn tệp trong một thư mục.
RickNZ

1
Sau khi thực hiện một số thay đổi được đề xuất ở trên, lần chạy thứ hai của "ls -R" cho cây crom mất 4,3 giây đối với tôi (so với 40 giây trong OP). "dir / s" mất khoảng một giây. Chuyển sang một ổ SSD không giúp ích cho việc liệt kê một mình, nhưng tôi nghi ngờ nó sẽ giúp cho việc biên dịch.
RickNZ

25

NTFS tiết kiệm thời gian truy cập tập tin mọi lúc. Bạn có thể thử vô hiệu hóa nó: "hành vi fsutil thiết lập disablelastaccess 1" (khởi động lại)


6
Thử nghiệm đã giảm 4 giây so với 36 trước đó. Vẫn còn gớm ghiếc so với .6 giây trên máy ảo linux của tôi
b7kich

21

Vấn đề với visual c ++ là, theo như tôi có thể nói, đó không phải là ưu tiên của nhóm biên dịch để tối ưu hóa kịch bản này. Giải pháp của họ là bạn sử dụng tính năng tiêu đề được biên dịch trước của họ. Đây là những gì các dự án cụ thể của windows đã làm. Nó không phải là di động, nhưng nó hoạt động.

Hơn nữa, trên các cửa sổ bạn thường có máy quét vi-rút, cũng như các công cụ tìm kiếm và khôi phục hệ thống có thể phá hỏng hoàn toàn thời gian xây dựng của bạn nếu chúng giám sát thư mục buid của bạn cho bạn. màn hình resouce windows 7 có thể giúp bạn phát hiện ra nó. Tôi có một câu trả lời ở đây với một số mẹo nữa để tối ưu hóa thời gian xây dựng vc ++ nếu bạn thực sự quan tâm.


17

Cá nhân tôi thấy việc chạy một máy ảo windows trên linux đã quản lý để loại bỏ rất nhiều sự chậm chạp IO trong windows, có thể là do linux vm đã thực hiện rất nhiều bộ nhớ đệm mà chính Windows không có.

Làm điều đó tôi đã có thể tăng tốc thời gian biên dịch của một dự án C ++ lớn (250Kloc) mà tôi đang thực hiện từ khoảng 15 phút đến khoảng 6 phút.


nghiêm túc? Ý bạn là tôi nên cho nó dùng thử để sử dụng VM như dev maschine? Nghe có vẻ lạ ... bạn dùng VM gì?
Martin Booka Weser

8
Tôi đã thử nghiệm kịch bản ở trên với máy ảo Ubuntu 11.04 chạy bên trong máy trạm windows 7 của tôi. 0,6 giây cho máy ảo linux, 36 giây cho máy trạm windows của tôi
b7kich

2
Nếu bạn sử dụng hộp ảo và thiết lập một ổ đĩa chung, về cơ bản bạn có thể tăng tốc các phần tổng hợp của mình miễn phí.
orlp

Từ ngữ ở đây rất khó hiểu, nhưng tôi cho rằng nó có nghĩa là máy ảo lưu trữ Windows chạy Linux, không phải máy ảo chạy Windows được lưu trữ trên Linux ... thật thú vị, nhưng lần đọc đầu tiên của tôi về điều này đã gợi ý rằng chạy Windows trong một VM lưu trữ trên Linux để biên dịch dẫn đến tốc độ nhanh hơn so với chạy Windows natively - và rằng sẽ đã thực sự được điều gì đó.
gạch dưới

@underscore_d, I have seen that một cái gì đó , nơi một Windows trong một máy ảo chạy nhiều nhanh hơn trên phần cứng thực sự. Có lẽ bởi vì Linux nói với Windows rằng nó hoạt động trên một đĩa thực, trong khi thực tế thì Linux đã lưu trữ bộ nhớ cache tích cực phía sau hậu trường. Chẳng hạn, việc cài đặt Windows trong máy ảo cũng rất nhanh. Điều này đã trở lại trong những ngày XP, nhưng tôi sẽ ngạc nhiên nếu có nhiều sự khác biệt ngày hôm nay.
Giáo sư Falken

17

Khó khăn trong việc đó là do C ++ có xu hướng tự lan truyền và quá trình biên dịch trên nhiều tệp nhỏ, riêng lẻ. Đó là điều mà Linux giỏi và Windows thì không. Nếu bạn muốn tạo một trình biên dịch C ++ thực sự nhanh chóng cho Windows, hãy cố gắng giữ mọi thứ trong RAM và chạm vào hệ thống tệp càng ít càng tốt.

Đó cũng là cách bạn sẽ tạo ra một chuỗi biên dịch Linux C ++ nhanh hơn, nhưng nó ít quan trọng hơn trong Linux vì hệ thống tệp đã thực hiện rất nhiều điều chỉnh đó cho bạn.

Lý do cho điều này là do văn hóa Unix: Trong lịch sử hiệu năng hệ thống tệp đã được ưu tiên cao hơn nhiều trong thế giới Unix so với Windows. Không phải nói rằng nó không phải là ưu tiên trong Windows, chỉ là trong Unix nó đã được ưu tiên cao hơn.

  1. Truy cập mã nguồn.

    Bạn không thể thay đổi những gì bạn không thể kiểm soát. Thiếu quyền truy cập vào mã nguồn Windows NTFS có nghĩa là hầu hết các nỗ lực cải thiện hiệu suất đã được cải thiện phần cứng. Đó là, nếu hiệu suất chậm, bạn giải quyết vấn đề bằng cách cải thiện phần cứng: xe buýt, phương tiện lưu trữ, v.v. Bạn chỉ có thể làm rất nhiều nếu bạn phải giải quyết vấn đề chứ không phải khắc phục nó.

    Truy cập vào mã nguồn Unix (ngay cả trước khi nguồn mở) phổ biến hơn. Do đó, nếu bạn muốn cải thiện hiệu suất, bạn sẽ giải quyết nó trong phần mềm trước (rẻ hơn và dễ dàng hơn) và phần cứng thứ hai.

    Kết quả là, có nhiều người trên thế giới có bằng tiến sĩ bằng cách nghiên cứu hệ thống tệp Unix và tìm ra những cách mới lạ để cải thiện hiệu suất.

  2. Unix có xu hướng hướng tới nhiều tệp nhỏ; Windows có xu hướng hướng tới một vài (hoặc một) tệp lớn.

    Các ứng dụng Unix có xu hướng xử lý nhiều tệp nhỏ. Hãy nghĩ về một môi trường phát triển phần mềm: nhiều tệp nguồn nhỏ, mỗi tệp có mục đích riêng. Giai đoạn cuối cùng (liên kết) không tạo ra một tệp lớn nhưng đó là một tỷ lệ nhỏ.

    Kết quả là, Unix đã tối ưu hóa các cuộc gọi hệ thống để mở và đóng tệp, quét các thư mục, v.v. Lịch sử của các tài liệu nghiên cứu Unix trải qua nhiều thập kỷ tối ưu hóa hệ thống tệp đặt nhiều suy nghĩ vào việc cải thiện quyền truy cập thư mục (tra cứu và quét toàn bộ thư mục), mở tệp ban đầu, v.v.

    Các ứng dụng Windows có xu hướng mở một tệp lớn, giữ nó mở trong một thời gian dài, đóng nó khi hoàn tất. Hãy nghĩ về MS-Word. msword.exe (hoặc bất cứ điều gì) mở tệp một lần và nối thêm hàng giờ, cập nhật các khối nội bộ, v.v. Giá trị của việc tối ưu hóa việc mở tệp sẽ bị lãng phí thời gian.

    Lịch sử của điểm chuẩn và tối ưu hóa Windows là về tốc độ người ta có thể đọc hoặc ghi các tệp dài. Đó là những gì được tối ưu hóa.

    Đáng buồn là sự phát triển phần mềm đã có xu hướng về tình huống đầu tiên. Heck, hệ thống xử lý văn bản tốt nhất cho Unix (TeX / LaTeX) khuyến khích bạn đặt mỗi chương trong một tệp khác nhau và #incelling tất cả chúng lại với nhau.

  3. Unix tập trung vào hiệu năng cao; Windows tập trung vào trải nghiệm người dùng

    Unix bắt đầu trong phòng máy chủ: không có giao diện người dùng. Điều duy nhất người dùng nhìn thấy là tốc độ. Do đó, tốc độ là ưu tiên hàng đầu.

    Windows khởi động trên máy tính để bàn: Người dùng chỉ quan tâm đến những gì họ thấy và họ thấy UI. Do đó, nhiều năng lượng được dành cho việc cải thiện giao diện người dùng hơn hiệu suất.

  4. Hệ sinh thái Windows phụ thuộc vào sự lỗi thời theo kế hoạch. Tại sao tối ưu hóa phần mềm khi phần cứng mới chỉ là một hoặc hai năm?

    Tôi không tin vào các thuyết âm mưu nhưng nếu tôi làm vậy, tôi sẽ chỉ ra rằng trong văn hóa Windows có ít khuyến khích hơn để cải thiện hiệu suất. Các mô hình kinh doanh Windows phụ thuộc vào những người mua máy mới như đồng hồ. (Đó là lý do tại sao giá cổ phiếu của hàng ngàn công ty bị ảnh hưởng nếu MS vận hành hệ điều hành trễ hoặc nếu Intel bỏ lỡ ngày phát hành chip.). Điều này có nghĩa là có một sự khuyến khích để giải quyết các vấn đề về hiệu suất bằng cách nói với mọi người để mua phần cứng mới; không phải bằng cách cải thiện vấn đề thực sự: hệ điều hành chậm. Unix đến từ giới hàn lâm nơi ngân sách eo hẹp và bạn có thể lấy bằng tiến sĩ bằng cách phát minh ra một cách mới để làm cho hệ thống tệp nhanh hơn; hiếm khi ai đó trong học viện nhận được điểm để giải quyết vấn đề bằng cách phát lệnh mua.

    Ngoài ra, vì Unix là nguồn mở (ngay cả khi không có, mọi người đều có quyền truy cập vào nguồn), bất kỳ sinh viên tiến sĩ buồn chán nào cũng có thể đọc mã và trở nên nổi tiếng bằng cách làm cho nó tốt hơn. Điều đó không xảy ra trong Windows (MS có một chương trình cho phép các học giả truy cập vào mã nguồn Windows, nó hiếm khi bị lợi dụng). Nhìn vào lựa chọn các tài liệu hiệu suất liên quan đến Unix này: http://www.eecs.harvard.edu/margo/ con / hoặc tìm kiếm lịch sử của các bài báo của Osterhaus, Henry Spencer, hoặc những người khác. Heck, một trong những cuộc tranh luận lớn nhất (và thú vị nhất để theo dõi) trong lịch sử Unix là mối quan hệ qua lại giữa Osterhaus và Selzer http://www.eecs.harvard.edu/margo/ con / usenix95-lfs / sup lúc /rebuttal . html Bạn không thấy điều đó xảy ra trong thế giới Windows. Bạn có thể thấy các nhà cung cấp hỗ trợ lẫn nhau, nhưng điều đó dường như hiếm hơn gần đây vì sự đổi mới dường như đều ở cấp độ cơ thể tiêu chuẩn.

Đó là cách tôi nhìn thấy nó.

Cập nhật: Nếu bạn nhìn vào chuỗi trình biên dịch mới sắp ra khỏi Microsoft, bạn sẽ rất lạc quan vì phần lớn những gì họ đang làm giúp giữ toàn bộ chuỗi công cụ trong RAM và lặp lại ít công việc hơn. Công cụ rất ấn tượng.


6
Nói rằng lý do là "văn hóa, không phải kỹ thuật" không thực sự trả lời câu hỏi. Rõ ràng, có một hoặc nhiều lý do kỹ thuật cơ bản tại sao các hoạt động nhất định trên Windows chậm hơn so với Linux. Bây giờ, các vấn đề văn hóa có thể giải thích tại sao mọi người đưa ra các quyết định kỹ thuật mà họ đã thực hiện; nhưng đây là một trang web hỏi đáp kỹ thuật. Câu trả lời nên bao gồm các lý do kỹ thuật tại sao một hệ thống chậm hơn hệ thống kia (và những gì có thể được thực hiện để cải thiện tình hình), không phải là những phỏng đoán không thể chứng minh về văn hóa.
Brian Campbell

Điều này dường như không có nhiều thông tin kỹ thuật. Chủ yếu là hoàn cảnh. Tôi nghĩ rằng cách duy nhất chúng ta sẽ có được thông tin kỹ thuật thực sự là bằng cách xem xét sự khác biệt giữa hai trình biên dịch, xây dựng hệ thống, v.v.
Surfasb

Các ứng dụng Windows có xu hướng mở một tệp lớn, giữ nó mở trong một thời gian dài - Rất nhiều ứng dụng UNIX làm điều này. Máy chủ, Emacs của tôi, v.v.
Noufal Ibrahim

Tôi không nghĩ emacs giữ các tệp mở trong một thời gian dài cho dù nó lớn hay nhỏ. Nó chắc chắn không ghi vào giữa tệp, cập nhật nó như một cơ sở dữ liệu.
TomOnTime

Máy chủ và máy chủ cũng không làm điều đó. Các tính năng của chúng trên các hệ thống * nix thường được chia thành nhiều mô-đun nhỏ với lõi máy chủ về cơ bản là một vỏ trống.
quang phổ

7

Liên kết tăng dần

Nếu giải pháp VC 2008 được thiết lập thành nhiều dự án với đầu ra .lib, bạn cần đặt "Sử dụng đầu vào phụ thuộc thư viện"; điều này làm cho liên kết liên kết trực tiếp với các tệp .obj chứ không phải .lib. (Và thực sự làm cho nó liên kết tăng dần.)

Hiệu suất truyền tải thư mục

Thật không công bằng khi so sánh thu thập thông tin thư mục trên máy ban đầu với thu thập thông tin thư mục mới được tạo với cùng một tệp trên máy khác. Nếu bạn muốn một bài kiểm tra tương đương, có lẽ bạn nên tạo một bản sao khác của thư mục trên máy nguồn. (Nó có thể vẫn chậm, nhưng điều đó có thể là do bất kỳ số lượng nào: phân mảnh đĩa, tên tệp ngắn, dịch vụ nền, v.v.) Mặc dù tôi nghĩ rằng các vấn đề hoàn hảo dir /scó liên quan đến việc ghi đầu ra hơn là đo tệp thực tế hiệu suất truyền tải. Thậm chí dir /s /b > nullà chậm trên máy của tôi với một thư mục lớn.


6

Tôi khá chắc chắn rằng nó liên quan đến hệ thống tập tin. Tôi làm việc trong một dự án đa nền tảng cho Linux và Windows, nơi tất cả các mã là phổ biến ngoại trừ nơi mã phụ thuộc vào nền tảng là hoàn toàn cần thiết. Chúng tôi sử dụng Mercurial, không phải git, vì vậy "Linuxness" của git không áp dụng. Kéo theo các thay đổi từ kho lưu trữ trung tâm sẽ mất mãi mãi trên Windows so với Linux, nhưng tôi phải nói rằng các máy Windows 7 của chúng tôi làm tốt hơn rất nhiều so với Windows XP. Biên dịch mã sau đó thậm chí còn tệ hơn trên VS 2008. Nó không chỉ là hg; CMake cũng chạy chậm hơn rất nhiều trên Windows và cả hai công cụ này đều sử dụng hệ thống tệp nhiều hơn bất kỳ thứ gì khác.

Vấn đề tồi tệ đến mức hầu hết các nhà phát triển của chúng tôi làm việc trong môi trường Windows thậm chí không bận tâm đến việc xây dựng gia tăng nữa - họ thấy rằng việc xây dựng sự thống nhất thay vào đó nhanh hơn.

Ngẫu nhiên, nếu bạn muốn giảm đáng kể tốc độ biên dịch trong Windows, tôi khuyên bạn nên xây dựng sự thống nhất nói trên. Thật khó để thực hiện chính xác trong hệ thống xây dựng (tôi đã làm điều đó cho nhóm của chúng tôi trong CMake), nhưng một khi đã thực hiện tự động tăng tốc mọi thứ cho các máy chủ tích hợp liên tục của chúng tôi. Tùy thuộc vào số lượng nhị phân mà hệ thống xây dựng của bạn phun ra, bạn có thể nhận được 1 đến 2 đơn hàng cải thiện cường độ. Số dặm của bạn có thể thay đổi. Trong trường hợp của chúng tôi, tôi nghĩ rằng nó đã tăng tốc cho Linux xây dựng gấp ba lần và Windows gấp khoảng 10 lần, nhưng chúng tôi có rất nhiều thư viện và thực thi chung (làm giảm lợi thế của việc xây dựng sự thống nhất).


5

Làm thế nào để bạn xây dựng dự án đa nền tảng lớn của bạn? Nếu bạn đang sử dụng các tệp tạo tệp chung cho Linux và Windows, bạn có thể dễ dàng làm giảm hiệu suất của cửa sổ xuống 10 lần nếu các tệp tạo tệp không được thiết kế để nhanh trên Windows.

Tôi vừa sửa một số tệp tạo tệp của dự án đa nền tảng bằng cách sử dụng tệp tạo tệp chung (GNU) cho Linux và Windows. Make đang bắt đầu một sh.exequy trình cho mỗi dòng công thức gây ra sự khác biệt về hiệu năng giữa Windows và Linux!

Theo tài liệu của GNU

.ONESHELL:

nên giải quyết vấn đề, nhưng tính năng này (hiện tại) không được hỗ trợ cho Windows make. Vì vậy, việc viết lại các công thức nấu ăn nằm trên các dòng logic đơn (ví dụ: bằng cách thêm; \ hoặc \ ở cuối các dòng biên tập hiện tại) hoạt động rất tốt!


4

IMHO đây là tất cả về hiệu suất I / O của đĩa. Thứ tự cường độ cho thấy rất nhiều hoạt động đi vào đĩa trong Windows trong khi chúng được xử lý trong bộ nhớ trong Linux, tức là Linux đang lưu trữ tốt hơn. Tùy chọn tốt nhất của bạn dưới cửa sổ sẽ là di chuyển các tệp của bạn vào một đĩa, máy chủ hoặc hệ thống tệp nhanh. Cân nhắc việc mua Ổ đĩa thể rắn hoặc di chuyển tệp của bạn sang máy chủ NFS ramdisk hoặc nhanh.

Tôi đã chạy các kiểm tra duyệt thư mục và kết quả rất gần với thời gian biên dịch được báo cáo, cho thấy điều này không liên quan gì đến thời gian xử lý CPU hoặc thuật toán trình biên dịch / liên kết.

Thời gian đo như đề xuất ở trên đi ngang qua cây thư mục crom:

  • Windows Home Premium 7 (8GB Ram) trên NTFS: 32 giây
  • Ubuntu 11.04 Linux (Ram 2GB) trên NTFS: 10 giây
  • Ubuntu 11.04 Linux (Ram 2GB) trên ext4: 0,6 giây

Đối với các bài kiểm tra, tôi đã kéo các nguồn crom (cả dưới win / linux)

git clone http://github.com/chromium/chromium.git 
cd chromium
git checkout remotes/origin/trunk 

Để đo thời gian tôi chạy

ls -lR > ../list.txt ; time ls -lR > ../list.txt # bash
dir -Recurse > ../list.txt ; (measure-command { dir -Recurse > ../list.txt }).TotalSeconds  #Powershell

Tôi đã tắt dấu thời gian truy cập, trình quét vi-rút của tôi và tăng cài đặt trình quản lý bộ đệm trong cửa sổ (> RAM 2Gb) - tất cả đều không có bất kỳ cải tiến đáng chú ý nào. Thực tế của vấn đề là, Linux vượt trội hơn 50 lần so với Windows với một phần tư RAM.

Đối với bất kỳ ai muốn tranh luận rằng các con số sai - vì bất kỳ lý do gì - vui lòng thử và đăng phát hiện của bạn.


1
Sau khi thực hiện một vài điều chỉnh mà tôi mô tả trong câu trả lời của mình cho Windows, việc chạy thử nghiệm "ls -lR" ở trên trên cây crom mất 19,4 giây. Nếu tôi sử dụng "ls -UR" thay vào đó (không nhận được số liệu thống kê tệp), thời gian sẽ giảm xuống còn 4,3 giây. Di chuyển cây sang ổ SSD không tăng tốc bất cứ thứ gì, vì dữ liệu tệp được HĐH lưu vào bộ nhớ cache sau lần chạy đầu tiên.
RickNZ

Cám ơn vì đã chia sẻ! Mặc dù có sự cải thiện về yếu tố 10 so với kịch bản 'vượt trội' của Windows 7, nhưng đó vẫn là yếu tố 10 kém hơn so với Linux / ext4.
b7kich

Tôi nghĩ rằng quan điểm của OP là cải thiện hiệu suất Windows, phải không? Ngoài ra, như tôi đã đăng ở trên, "dir / s" chạy trong khoảng một giây.
RickNZ

3

Hãy thử sử dụng jom thay vì nmake

Lấy nó ở đây: https://github.com/qt-labs/jom

Thực tế là nmake chỉ sử dụng một trong số các lõi của bạn, jom là một bản sao của nmake sử dụng bộ xử lý đa lõi.

GNU thực hiện được điều đó nhờ vào tùy chọn -j, đó có thể là một lý do về tốc độ của nó so với Microsoft nmake.

jom hoạt động bằng cách thực hiện song song các lệnh khác nhau trên các bộ xử lý / lõi khác nhau. Hãy thử cho mình một cảm giác khác biệt!


1

Tôi muốn thêm chỉ một quan sát bằng cách sử dụng Gnu và các công cụ khác từ các công cụ MinGW trên Windows: Chúng dường như giải quyết tên máy chủ ngay cả khi các công cụ thậm chí không thể giao tiếp qua IP. Tôi đoán điều này là do một số thói quen khởi tạo của thời gian chạy MinGW. Chạy proxy DNS cục bộ đã giúp tôi cải thiện tốc độ biên dịch với các công cụ này.

Trước đây tôi rất đau đầu vì tốc độ xây dựng giảm xuống 10% khi tôi mở kết nối VPN song song. Trong trường hợp này, tất cả các tra cứu DNS này đều đi qua VPN.

Quan sát này cũng có thể áp dụng cho các công cụ xây dựng khác, không chỉ dựa trên MinGW và nó có thể đã thay đổi trên phiên bản MinGW mới nhất trong khi đó.


0

Gần đây tôi có thể lưu trữ một cách khác để tăng tốc độ biên dịch khoảng 10% trên Windows bằng cách sử dụng Gnu bằng cách thay thế mingw bash.exe bằng phiên bản từ win-bash

(Win-bash không thoải mái lắm về chỉnh sửa tương tá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.