Natknąłem się na artykuł, w którym studenci wykorzystali ruch sieciowy do narysowania swojego uniwersytetu na wykresie IPv6 w tym kraju . [wizerunek]
Twój cel jest prosty do opisania, ale trudny do zrealizowania. Narysuj tekst MAIL (ponieważ jest to jedno z niewielu słów, które można odczytać na wykresie 1D) na wykresie procesora.
Powinno to wyglądać mniej więcej tak:
Trochę więcej pracy nad tym, co się kwalifikuje:
- Kod nie musi być wieloplatformowy (więc nie będziesz potrzebować nieznanych API do obsługi).
- Możesz przechwycić go w dowolnym ogólnym narzędziu do użycia procesora.
- Wykres wygląda nieco gorzej na innym komputerze: tym razem ci ufam.
- Podstawowy% wykorzystania procesora musi być ciągły, więc jeśli wygenerujesz losową falę i podświetlisz coś, co wygląda jak słowo MAIL, to oczywiście oszustwo.
- Możesz wybrać maksymalne obciążenie, które chcesz użyć, ale musi ono być wystarczająco duże, aby było wyraźnie widoczne.
- Musisz przestrzegać liniowości przykładu. (Dla M wygląda to tak:% bazy, a następnie nagły wzrost do określonego maksimum, spada stopniowo do niższego%, wznosi się z powrotem do maksimum i ponownie gwałtownie spada do podstawy%).
- Jeśli to nieczytelne, wyborcy zauważą przecież.
Obowiązują standardowe luki. Opublikuj też zdjęcia!
Odpowiedzi:
Python, 143
Każdy znak ciągu odpowiada jednej sekundzie aktywności, od znaku ASCII
0
(maksymalne obciążenie) do~
(bardzo małe obciążenie). Program działa w pętli synchronizowanej czasowo, dzięki czemu można uruchamiać wiele instancji w celu uzyskania lepszych wyników.Użyłem Pythona 2.7.6 na OS X z Intel Core i7, ale powinien on działać na innych komputerach z drobnymi poprawkami (dostosuj
0.001
). Poniższy zrzut ekranu został zrobiony ze znaczną aktywnością w tle.Aktualizacja - byłem w stanie stworzyć wyraźniejszy wykres przy
time()/10
niższej częstotliwości aktualizacji:I na koniec, oto wersja bardziej golfowa ( 123 bajty ) i jej wynik :
źródło
Python,
358281268221194 bajtówMonochrome jest tak w zeszłym roku. Wykorzystuje wiele procesów i wywołań systemowych, aby uzyskać dwa kolorowe wykresy procesora!
Dane wyjściowe z Monitora aktywności (OS X 10.9):
Dane wyjściowe z MenuMeters:
Wszystkie dane wyjściowe zostały wygenerowane z prędkością aktualizacji 1s. Żadne znaczące zadania w tle nie były uruchomione, ale dane wyjściowe dość łatwo pokonują jedno-wątkowe zadanie CPU.
Ten kod zakłada, że masz 8 rdzeni. Powinno być dość łatwe do modyfikacji za mniej / więcej. Jest przenośny dla systemów Linux / UNIX (chociaż został przetestowany tylko w systemie OS X) i powinien generować takie same dwukolorowe wyjście dla każdego monitora procesora, który może odróżnić użytkownika od czasu procesora systemowego.
Zasadniczo działa to poprzez wykasowanie siedmiu procesów, z których każdy wybierze 1 sekundę spania, wirowania w trybie użytkownika lub wirowania jądra. Wirowanie w trybie jądra osiąga się przez żądanie dużych globów danych
/dev/urandom
, co zmusza sterownik/dev/urandom
do zużywania dużej ilości „systemowych” cykli procesora.ZMIENIONO [07/21]: Znacząco skrócono przez użycie
fork()
zamiastmultiprocessing.Process
(/dev/urandom
działa tylko na systemach * NIX, więc nie zmniejsza to przenośności). Zauważ jednak, że program odradza teraz zadania w tle ; być może będziesz musiałkillall Python
(lub podobnie) pozbyć się procesorów.Nie mogłem się oprzeć wdrożeniu jeszcze kilku listów. Mam 16 liter i kilka symboli:
Kompletny alfabet to „ACDFHILMNOPTUVWY”, z symbolami „._ ~ / \”. Prawdopodobnie jest o wiele więcej znaków, które mogą być reprezentowane.
Całkowicie nieoznaczony kod dla dodatkowych liter:
źródło
C (Intel Core Duo + OS X / Darwin), 248 bajtów
Ten kod jest tak samo przenośny jak Wielka Piramida Cheopsa. Przepraszam za to. Wartości zwracane z
mach_absolute_time()
są zależne od sprzętu, ale na mojej maszynie wartość zwiększa się mniej więcej raz na nanosekundę.Oto wynik:
Istnieją dwa wykresy, ponieważ procesor ma dwa rdzenie. Ustawiam maksymalne obciążenie procesora na około 90%, ponieważ proces może przełączać się między rdzeniami za każdym razem, gdy dzwonię
usleep()
. Przy 100% obciążeniu proces jest przykuty do jednego rdzenia, a wyniki są nieczytelne ( patrz na przykład )źródło
uint64_t
zmiennych w nagłówku kolejnejfor
pętli?Ruby, 150 znaków
Jak dotąd nie jest to wcale takie krótkie, ale moim zdaniem wyniki są raczej niezłe, więc pomyślałem, że i tak to opublikuję. Podobnie jak w przypadku większości innych rozwiązań, może być konieczne przypięcie procesu Ruby do określonego rdzenia przez jego prefiks
taskset -c $core
.Kod jest prostą kombinacją wirowania / spania przez określony czas, co powinno uczynić go nieco przenośnym. Gładkie gradienty tworzone są poprzez zmianę stosunku czasu wirowania / snu.
Obniżenie częstotliwości próbkowania procesora sprawia, że krawędzie wyglądają nieco lepiej:
Dodając jeszcze kilka liter do alfabetu (
AILMNUVW
są nieco rozpoznawalne), możemy również napisać kilka innych słów:Te zdjęcia zostały wygenerowane za pomocą następującego kodu:
Słowa, które można zapisać za pomocą zaimplementowanych liter, można znaleźć za pomocą
źródło
Python, na Intel Pentium 4 3,0 Ghz,
180 166 145 141138 138 bajtówZadzwoń z
taskset -c 0 python cpu_graph_drawer.py
.taskset
jest potrzebne, aby ograniczyć proces do korzystania tylko z jednego procesora / rdzenia (w moim przypadku hyperthreading).Wynik nie jest taki wspaniały.
źródło
gnome-system-monitor
to jedyne, co wiem. Masz jakieś alternatywy, które działałyby na LMDE Cinnamon?a=[...]+[(.1,.2)]*10
zamiast.extend
.Java 8, 482 znaków
Każdy znak w ciągu oznacza liczbę wątków, które zostaną wykorzystane. Zdjęcie zrobione na Intel Core i3 (2 rdzenie / 4 wątki).
Edycja : wersja bardziej golfowa (322 znaki), ta sama funkcjonalność:
źródło
C, 78 bajtów
Nigdy nie powiedziałeś, że nie możemy zaakceptować danych wprowadzanych przez użytkownika, więc…
Ten program wczytuje ze standardowego wejścia i za każdym razem, gdy czyta znak, wykonuje nieuzasadnione marnowanie procesora dla pętli, a następnie ponownie wywołuje main. Kontrolujesz ilość czasu wykorzystywanego przez procesor, spamując klawisz Enter z różnymi prędkościami.
Uruchomiłem to na procesorze Intel i3 4130T, który jest dość nowym procesorem. Ale twój przebieg może się różnić, jeśli zużywa mniej lub więcej czasu procesora, niż jest to praktyczne do zaobserwowania, spróbuj grać z wielkością przesunięcia w pętli opóźnienia.
Mój program jest niesamowity, ponieważ:
Po kilku próbach stworzyłem wykres, który wyglądał tak:
źródło
taskset -c 1 [file]
yes | [program]