2009-05-30 37 views
21

Tôi đang sử dụng Mã :: Blocks IDE với GCC/MinGW trên Windows và tôi đang cố gắng tạo ứng dụng wxWidgets có ca. 20k dòng và 40 mô-đun nguồn. Và nó xây dựng rất rất chậm.Tại sao MinGW lại rất chậm?

Biên dịch mô-đun C++ kéo dài 2-5 giây và liên kết kéo dài thậm chí 2-3 phút.

Đó là mã di động và mã này biên dịch rất nhanh trên Linux. Tôi không thể làm theo cửa sổ thông báo xây dựng ... Toàn bộ quá trình kéo dài dưới 20 giây.

Tôi đã thử các chỉnh sửa phổ biến (ví dụ: tiêu đề được biên dịch sẵn, tắt tối ưu hóa, v.v.) nhưng không có tác dụng.

Tại sao quá chậm?

+0

bạn đang sử dụng phiên bản gcc nào? làm gcc --version tại dòng lệnh để tìm hiểu –

+0

Phiên bản gcc là v3.4.5 – Calmarius

Trả lời

13

Bạn đang ở trên miền Active Directory nhưng chưa kết nối ngay với nó?

Trong khi tôi không có "câu trả lời" là tại sao MinGW sẽ chậm, đó là kinh nghiệm của tôi rằng các máy tính thuộc miền AD, nhưng không thể tiếp cận với bộ điều khiển AD, có sự chậm trễ khi bắt đầu các tệp thực thi (chẳng hạn như rxvt.exe) và các trình chạy hiện đang chạy tạm dừng hoặc nói lắp (chẳng hạn như các emacs, được xây dựng bằng cách sử dụng MinGW).

Tôi vẫn đang điều tra để xác định thực tế gây ra hành vi này, nhưng tôi nghĩ sẽ đề cập đến nó trong trường hợp áp dụng cho bạn.

+5

+1 Tôi cũng đang gặp phải điều này, vô hiệu hóa các bộ điều hợp mạng của tôi sẽ dẫn đến khởi động ngay lập tức. Đặt các mục DNS không có thật (127.0.0.1) cho các bộ điều khiển miền trong tệp máy chủ của tôi làm cho mọi thứ trở nên nhanh hơn, nhưng không nhanh như tắt toàn bộ mạng. –

+0

Bộ điều khiển AD của chúng tôi là: server.domain.com. Thêm "127.0.0.1 server.domain.com" vào tệp máy chủ của tôi thực hiện thủ thuật. – rcmadruga

+0

Cảm ơn gợi ý này. Tôi đã tự hỏi cho các lứa tuổi tại sao điều này xảy ra chỉ trên một trong các máy của tôi! Điều đó xảy ra là nó không được kết nối với miền AD của nó ... –

0

Bạn có thể thử sử dụng phiên bản bộ công cụ mới hơn. Tôi thấy điều này hữu ích: http://nuwen.net/mingw.html Nó có tất cả các công cụ được sử dụng bởi MinGW và các API phổ biến trong một gói lớn duy nhất. Từ trang web:

phân phối My MinGW ("distro") là x64-nguồn gốc và hiện chứa GCC 6.1.0 và Tăng 1.61.0.

MinGW là một cổng GCC cho Windows. Nó là miễn phí và đơn giản để sử dụng (tốt, đơn giản như các công cụ nhận được). Nó tạo ra các tệp thi hành Windows độc lập có thể được phân phối theo bất kỳ cách nào.

6

Nhiều thứ "không ổn định" trên MinGW rất chậm, vì Windows không có fork(). Windows chỉ có CreateProcess(), hoàn toàn khác. Vỏ Unix và GNU Hãy thực hiện rất nhiều việc gây khó khăn, vì vậy hãy chạy các kết quả này dưới các kết quả của MinGW trong các nhánh "mô phỏng", vốn rất chậm.

Một điều khác bị ảnh hưởng là GNU Autotools, do đó, chạy tập lệnh ./configure khi xây dựng ứng dụng "không đồng bộ" từ nguồn cũng rất chậm. Điều này có thể thực sự gây phiền nhiễu nếu bạn cần thực hiện nhiều lần (ví dụ: khi gặp sự cố khi nhận được định cấu hình để tìm tất cả thư viện).

This answer giải thích chi tiết hơn cách Cygwin và MinGW sử dụng để mô phỏngfork(), và this answer có nhiều cập nhật lời giải thích.

+1

Bạn đang cố gắng nói với chúng tôi rằng fork() thực sự được sử dụng để sao chép quá trình hiện tại thay vì được theo sau bởi execp()? Trình biên dịch/trình liên kết nào cần sao chép một tiến trình? –

+1

@ExcessPhase Tôi không chắc chắn ý bạn là gì. Các chương trình Unix sử dụng 'fork()' để tạo các tiến trình con. Khi bạn biên dịch chương trình Unix đó cho MinGW, lệnh 'fork()' vẫn * cần tạo một tiến trình con giống như trong Unix "thực", ngay cả khi 'fork()' được theo sau bởi * exec *, không vấn đề làm thế nào chậm các ngã ba mô phỏng MinGW là, bởi vì trình biên dịch không thể thay đổi mã chương trình để làm việc hiệu quả hơn trong Windows. – hyde

+0

@ExcessPhase Mặc dù, mọi thứ có thể đã được tối ưu hóa, tôi đã thêm một liên kết trả lời thứ 2 ngay bây giờ. – hyde

1

Tính đến MSYS 1.0.19-1, nếu tài khoản người dùng trong miền Active Directory và Domain Controller (DC) là unreachable, sau đó MSYS DLL sẽ giới thiệu một sự chậm trễ rất lâu trước khi bắt đầu bất kỳ MSYS thực thi (có sử dụng MSYS DLL).Điều này ảnh hưởng đến MSYS make và tất cả các tiện ích dòng lệnh từ gói CoreUtils chẳng hạn như ls, rm v.v. thường được cài đặt trong C:\MinGW\msys\1.0\bin.

Quan sát:

  • Khi tung ra các tiện ích từ MSYS bash vỏ, khởi động duy nhất của vỏ được ảnh hưởng bởi sự chậm trễ. Các tiện ích được khởi chạy từ trình bao không phải là tác động.

  • Thời gian trễ có thể thay đổi, trong trường hợp của tôi là 21 giây.

  • Chạy bất kỳ tiện ích MSYS nào trong vòng 10-20 giây sau khi lệnh bị trì hoãn sẽ khởi chạy mà không có sự chậm trễ mới.
  • Sự cố xảy ra khi máy được kết nối với mạng khác hoặc khi bị ngắt kết nối khỏi miền hoặc khi tên máy chủ Domain Controller thay đổi (sự cố trong trường hợp của tôi). Để kiểm tra xem DC có thể truy cập được không, hãy mở cmd và nhập echo %LOGONSERVER%, sau đó ping hoặc net view với tên máy chủ lưu trữ của DC.

Tại sao nó quá chậm:

  • Mã của MSYS DLL trong uinfo.cc internal_getlogin() làm hai hệ thống cuộc gọi để nhận thông tin người dùng. Lần đầu tiên, nó gọi số NetUserGetInfo() để truy xuất lại tài khoản người dùng từ máy cục bộ. Nó không thành công cho người dùng miền, vì vậy nó gọi nó lần thứ hai với máy chủ DC được lấy từ biến số LOGONSERVER. Nếu máy chủ này không truy cập được ngay lập tức, nó sẽ giới thiệu một sự chậm trễ lâu cho đến khi cuộc gọi không thành công khi hết thời gian chờ. Ứng dụng sẽ bắt đầu ngay sau đó.

Làm thế nào để tránh vấn đề này, một số cách giải quyết:

  • Hoặc chạy tất cả mọi thứ từ MSYS vỏ, hoặc
  • Nếu lý do là sự thay đổi trong DC hostname, sau đó khởi động lại hay đăng nhập lại sẽ giải quyết vấn đề. Windows sẽ tự động cập nhật LOGONSERVER với máy chủ DC chính xác.
  • Nếu công cụ MSYS được gọi từ Windows cmd hoặc tập lệnh, sau đó đặt LOGONSERVER thành máy chủ cục bộ để tránh truy cập mạng. Ví dụ. set LOGONSERVER=\\LOCALHOST đã làm việc cho tôi. Lưu ý: biến này được đặt lúc đăng nhập và thay đổi nó trên toàn cầu trong cửa sổ Biến môi trường Windows không có tác dụng so với cài đặt trong cmd hoặc tập lệnh.
  • Tôi coi đây là lỗi trong MinGW/MSYS. Mã trong MSYS2 và Cygwin là khác nhau. Tôi đã kiểm tra MSYS2 và nó không có vấn đề như vậy.