Làm cho chương trình chạy chậm


102

Có cách nào để chạy chương trình C ++ chậm hơn bằng cách thay đổi bất kỳ thông số hệ điều hành nào trong Linux không? Bằng cách này, tôi muốn mô phỏng điều gì sẽ xảy ra nếu chương trình cụ thể đó chạy trên một máy thực sự chậm hơn.

Nói cách khác, một máy nhanh hơn sẽ hoạt động như một máy chậm hơn với chương trình cụ thể đó.


5
Bạn có thể sử dụng 'nice' để ưu tiên thực sự thấp - không phải là điều dứt khoát, nhưng có thể hữu ích!
John3136

7
chạy nó bên trong một vm với một chương trình khác quay bộ xử lý.
thang

12
nicelà một lệnh làm giảm mức độ ưu tiên lập lịch trình. Cổ kính, tương đối thô. Bạn có thể xem xét mức độ ưu tiên của lịch trình, nhưng nếu máy không bận làm việc khác, chương trình của bạn sẽ vẫn chạy nhanh. Vì vậy, nó có thể sẽ không giúp đủ.
Jonathan Leffler

9
Bạn phải nhớ rằng máy tính có rất nhiều quy trình đang chạy bất cứ lúc nào, chẳng hạn như việc chỉ làm cho ứng dụng của bạn chạy chậm hơn sẽ không đặc biệt hữu ích. Nếu bạn muốn xem ứng dụng của mình hoạt động như thế nào trên phần cứng tồi tệ thì bạn nên nhận thông báo phần cứng tồi tệ hoặc tạm thời thay đổi cài đặt BIOS của phần cứng để làm cho nó trở nên tồi tệ. Một số BIOS sẽ cho phép bạn vô hiệu hóa các lõi phụ và làm giảm xung nhịp của CPU.
Mike Trusov

23
Mở nút "Turbo"!
SoftDev

Câu trả lời:


145
  • Giảm mức độ ưu tiên bằng cách sử dụng nice(và / hoặc renice). Bạn cũng có thể làm điều đó theo lập trình bằng nice()lệnh gọi hệ thống. Điều này sẽ không làm chậm tốc độ thực thi cho mỗi gia nhập, nhưng sẽ làm cho Linux lên lịch phân bổ ít (và có thể ngắn hơn) khung thời gian thực hiện, có quyền mua trước thường hơn, vv Xem Process Scheduling (Chương 10) của Hiểu nhân Linux để biết thêm chi tiết về lịch trình .
  • Bạn có thể muốn tăng tần suất ngắt bộ hẹn giờ để dồn nhiều tải hơn cho hạt nhân, điều này sẽ làm mọi thứ chậm lại. Điều này yêu cầu xây dựng lại hạt nhân.
  • Bạn có thể sử dụng cơ chế Chia tỷ lệ Tần số CPU (yêu cầu mô-đun hạt nhân) và điều khiển (làm chậm, tăng tốc) CPU bằng cpufreq-setlệnh.
  • Một khả năng khác là gọi sched_yield(), điều này sẽ mang lại lượng tử cho các quy trình khác, trong các phần quan trọng về hiệu suất của chương trình của bạn (yêu cầu thay đổi mã).
  • Bạn có thể treo các chức năng thông thường như malloc(), free(), clock_gettime(), vv sử dụng LD_PRELOAD , và làm một số công cụ ngớ ngẩn như ghi một vài triệu chu kỳ CPU với rep; hop;, chèn rào cản bộ nhớ vv Điều này sẽ làm chậm chương trình chắc chắn. (Xem câu trả lời này để biết ví dụ về cách thực hiện một số công cụ này).
  • Như @Bill đã đề cập, bạn luôn có thể chạy Linux trong một phần mềm ảo hóa cho phép bạn giới hạn số lượng tài nguyên CPU được phân bổ, bộ nhớ, v.v.
  • Nếu bạn thực sự muốn chương trình của mình chạy chậm, hãy chạy nó trong Valgrind (cũng có thể giúp bạn tìm thấy một số vấn đề trong ứng dụng của mình như rò rỉ bộ nhớ, tham chiếu bộ nhớ kém, v.v.).
  • Có thể đạt được một số độ chậm bằng cách biên dịch lại tệp nhị phân của bạn với các tính năng tối ưu hóa bị vô hiệu hóa (tức là -O0và bật xác nhận (ví dụ -DDEBUG).
  • Bạn luôn có thể mua một chiếc PC cũ hoặc một chiếc netbook giá rẻ (như Một chiếc máy tính xách tay cho mỗi đứa trẻ , và đừng quên tặng nó cho một đứa trẻ sau khi bạn kiểm tra xong) có CPU chậm và chạy chương trình của bạn.

Hy vọng nó giúp.


15
+1: tập hợp các đề xuất khác nhau, bao gồm các yêu cầu cơ bản cho từng
lxop

4
Bật ký hiệu gỡ lỗi ( -ggdb3) không làm chậm quá trình thực thi của tệp nhị phân. Nó chỉ làm cho nó lớn hơn.
caf

11
+1 đặc biệt., Cho "... mua một chiếc PC cũ hoặc một chiếc netbook giá rẻ ... và đừng quên tặng nó cho một đứa trẻ sau khi bạn kiểm tra xong"
Kris

3
Bạn có thể chỉnh sửa câu trả lời của mình để chỉ ra cách mô phỏng các loại 'chậm' khác nhau không? Có sự khác biệt giữa I / O chậm, CPU chậm, bộ nhớ chậm, bộ nhớ hoạt động mạnh, v.v.
parasietje

3
+1 cho Vlad. Có lẽ cpufreq rất dễ thực hiện, nếu bạn có hỗ trợ CPU và nhân linux. Điều này phải có mức độ chi tiết của hướng dẫn. Đây có lẽ là câu trả lời chung chung tốt nhất mà không cần mua phần cứng mới; nó không mô phỏng mạng, đĩa, video, v.v. chậm hơn, điều này cũng có thể gây ra các cuộc đua.
không khéo tiếng ồn

36

QEMU là một trình giả lập CPU cho Linux. Debian có các gói cho nó (tôi tưởng tượng hầu hết các bản phân phối sẽ có). Bạn có thể chạy chương trình trong trình giả lập và hầu hết chúng sẽ hỗ trợ làm chậm mọi thứ. Ví dụ, Miroslav Novak có các bản vá để làm chậm QEMU.

Ngoài ra, bạn có thể biên dịch chéo sang một CPU-linux khác (arm-none-gnueabi-linux, v.v.) và sau đó yêu cầu QEMU dịch mã đó để chạy.

Các đẹp gợi ý rất đơn giản và có thể có tác dụng nếu bạn kết hợp nó với một quá trình mà sẽ tiêu thụ CPU.

nice -19 test &
while [ 1 ] ; do sha1sum /boot/vmlinuz*; done;

Bạn đã không nói nếu bạn cần đồ họa, tệp và / hoặc I / O mạng? Bạn có biết điều gì đó về lớp lỗi mà bạn đang tìm kiếm không? Đó có phải là một điều kiện chạy đua hay mã chỉ hoạt động kém trên trang web của khách hàng?

Chỉnh sửa: Bạn cũng có thể sử dụng các tín hiệu như STOPCONT để bắt đầu và dừng chương trình của mình. Trình gỡ lỗi cũng có thể làm điều này. Vấn đề là mã chạy với tốc độ tối đa và sau đó bị dừng lại. Hầu hết các giải pháp với bộ lập lịch Linux sẽ có vấn đề này. Có một số loại máy phân tích luồng từ Intel afair. Tôi thấy Ghi chú phát hành Vtune . Đây là Vtune, nhưng tôi khá chắc chắn rằng có một công cụ khác để phân tích các cuộc đua luồng. Xem: Bộ kiểm tra luồng của Intel , có thể kiểm tra một số điều kiện chạy luồng. Nhưng chúng tôi không biết ứng dụng có đa luồng không?


1
và bochs là trình giả lập cpu cũ hơn và chậm hơn (chỉ x86).
osgx

22

Sử dụng cpulimit:

Cpulimit là một công cụ giới hạn mức sử dụng CPU của một tiến trình (được biểu thị bằng tỷ lệ phần trăm, không phải thời gian CPU). Sẽ rất hữu ích để kiểm soát các công việc hàng loạt, khi bạn không muốn chúng ăn quá nhiều chu kỳ CPU. Mục đích là ngăn không cho quá trình chạy nhiều hơn một tỷ lệ thời gian được chỉ định. Nó không thay đổi giá trị tốt đẹp hoặc các cài đặt ưu tiên lập lịch khác, mà là việc sử dụng CPU thực . Ngoài ra, nó có thể tự thích ứng với tải tổng thể của hệ thống , một cách linh hoạt và nhanh chóng.

Việc kiểm soát lượng cpu đã sử dụng được thực hiện bằng cách gửi các tín hiệu SIGSTOP và SIGCONT POSIX đến các quy trình.

Tất cả các quy trình con và luồng của quy trình được chỉ định sẽ chia sẻ cùng một phần trăm CPU.

Nó nằm trong kho lưu trữ Ubuntu. Chỉ

apt-get install cpulimit

Dưới đây là một số ví dụ về cách sử dụng nó trên một chương trình đã chạy:

Giới hạn quá trình 'bigloop' theo tên thực thi ở mức 40% CPU:

cpulimit --exe bigloop --limit 40
cpulimit --exe /usr/local/bin/bigloop --limit 40 

Giới hạn một quá trình bằng PID đến 55% CPU:

cpulimit --pid 2960 --limit 55

Tôi chưa thử nghiệm cpulimit, nhưng có vẻ như đây là câu trả lời tốt nhất cho các câu hỏi tương tự trên các trang web SE. Có sự khác biệt đáng chú ý nào giữa một chương trình đang chạy với các giới hạn do cpulimit áp đặt và một chương trình chạy trên phần cứng chậm hơn không? Mục tiêu của tôi là kiểm tra một ứng dụng để đảm bảo ứng dụng đó đủ phản hồi trên các máy chậm hơn (và điều chỉnh đồ họa cho các máy chậm hơn).
trusktr

@trusktr Điều đó phụ thuộc nhiều vào những gì chương trình đó thực sự đang làm. Với phần cứng cũ hơn, tôi có thể nghĩ rằng tốc độ đĩa và bộ nhớ khả dụng (RAM) cũng ảnh hưởng đến hiệu suất, và từ phần đồ họa, GPU. Có thể có nhiều hơn nữa. Nếu CPU thực sự là nút cổ chai, thì cpulimit có lẽ vẫn đáng để thử. (Câu trả lời này đã có từ 7 năm trước, và hồi đó những bản hit biểu diễn như vậy không ở đâu gần trong tâm trí tôi)
Izkata

Hấp dẫn. Bạn nói đúng, tôi đã không xem xét HDD hay GPU. Tôi cho rằng thử nghiệm với phần cứng thực tế chậm hơn là cách tốt nhất để làm điều đó, nhưng hiện tại tôi chỉ có một máy trạm mạnh mẽ mặc dù tôi muốn xuất bản ngay cả cho điện thoại cấp thấp hơn (ứng dụng JS + WebGL).
trusktr

13
  1. Nhận một máy tính cũ
  2. Các gói lưu trữ VPS có xu hướng chạy chậm, có nhiều gián đoạn và độ trễ rất khác nhau. Bạn càng rẻ thì phần cứng sẽ càng tệ. Không giống như phần cứng cũ thực sự, rất có thể chúng sẽ chứa các tập lệnh (SSE4) thường không có trên phần cứng cũ. Tuy nhiên, nếu bạn muốn một hệ thống chạy chậm và thường xuyên đóng cửa, máy chủ VPS giá rẻ sẽ là sự khởi đầu nhanh chóng nhất.

3

Nếu bạn chỉ muốn mô phỏng chương trình của mình để phân tích hành vi của nó trên máy thực sự chậm, bạn có thể thử làm cho toàn bộ chương trình của mình chạy như một threadchương trình chính khác .

Theo cách này, bạn có thể ưu tiên cùng một mã với các mức ưu tiên khác nhau trong một vài chuỗi cùng một lúc và thu thập dữ liệu phân tích của bạn. Tôi đã sử dụng điều này trong phát triển trò chơi để phân tích xử lý khung hình.


2

Sử dụng chế độ ngủ hoặc đợi bên trong mã của bạn. Nó không phải là cách tốt nhất để làm nhưng có thể chấp nhận được ở tất cả các loại máy tính có tốc độ khác nhau.


2

Cách đơn giản nhất có thể để làm điều đó là quấn mã có thể chạy chính của bạn trong một vòng lặp while với dấu ngủ ở cuối mã.

Ví dụ:

void main()
{
    while 1
    {
        // Logic
        // ...
        usleep(microseconds_to_sleep)
    }
}

Như mọi người sẽ đề cập, đây không phải là cách chính xác nhất, vì mã logic của bạn sẽ vẫn chạy ở tốc độ bình thường nhưng có độ trễ giữa các lần chạy. Ngoài ra, nó giả định rằng mã logic của bạn là thứ chạy trong một vòng lặp.

Nhưng nó vừa đơn giản vừa có thể cấu hình.

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.