Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
56 changes: 56 additions & 0 deletions answer.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
(Замерять стоило профилировщиком, но на результаты это, в целом, не влияет)
(Характеристики машины: 4 ядра, 8 потоков)

#IO
1) Всего со 100 страниц wiki удалось спарсить 1034 ссылки, все они лежат в файле [res.txt](res.txt).

2) Замер скорости при синхронном опросе всех ссылок из [res.txt](res.txt).
* Скорость медленная, процессор почти не загружен, сеть используется не постоянно.
![](images/io/1.jpg)

3) Замер скорости при использовании 5 процессов для опроса всех ссылок из [res.txt](res.txt).
* Скорость увеличилась практически в 5 раз по сравнения с замером без процессов, возросла нагрузка на процессор, использовано немного больше оперативной памяти, сеть практически всегда используется.(относительно предыдущего замера)
![](images/io/5.jpg)

4) Замер скорости при использовании 10 процессов для опроса всех ссылок из [res.txt](res.txt).
* Скорость увеличилась практически в 10 раз по сравнения с замером без процессов, возросла нагрузка на процессор, использовано немного больше оперативной памяти, сеть практически всегда используется.(относительно предыдущего замера)
![](images/io/10.jpg)

5) Замер скорости при использовании 100 процессов для опроса всех ссылок из [res.txt](res.txt).
* Скорость увеличилась практически в 33 раз по сравнения с замером без процессов, возросла нагрузка на процессор, использовано немного больше оперативной памяти, сеть практически всегда используется.(относительно предыдущего замера)
![](images/io/100.jpg)

Вывод:
* Прирост производительности зависит от мощности пк.
* До определенного момента он происходит практически линейно, но после того как достигается потолок самого слабого звена системы, линейный рост пропадает и каждый следующий процесс приносит все меньше убыстрений.

#CPU
Во всех примерах сеть не используется. Будем генерировать 5 монет.
(Тестирование не совсем корректно, т.к. во многом зависит от рандома сгенерированных монет.)

1) Замер скорости при использовании одного процесса.
* Скорость медленная, процессор мало загружен.
![](images/cpu/1.jpg)

2) Замер скорости при использовании двух процессов.
* Скорость увеличилась на 5-10% по сравнения с замером без процессов, возросла нагрузка на процессор, использовано немного больше оперативной памяти.(относительно предыдущего замера)
![](images/cpu/2.jpg)

3) Замер скорости при использовании четырех процессов.
* Скорость увеличилась на 7-15% по сравнения с замером без процессов, возросла нагрузка на процессор, использовано немного больше оперативной памяти.(относительно предыдущего замера)
![](images/cpu/4.jpg)

4) Замер скорости при использовании пяти процессов.
* Скорость уменьшилась на 5-10% по сравнения с замером без процессов, нагрузка на процессор примерно равно нагрузке на прошлом этапе, использовано немного больше оперативной памяти.(относительно предыдущего замера)
![](images/cpu/5.jpg)

5) Замер скорости при использовании пяти процессов.
* Скорость уменьшилась на 7-12% по сравнения с замером без процессов, нагрузка на процессор примерно равно нагрузке на прошлом этапе, использовано немного больше оперативной памяти.(относительно предыдущего замера)
![](images/cpu/10.jpg)

6) Замер скорости при использовании пяти процессов.
* Скорость уменьшилась на 15-20% по сравнения с замером без процессов, нагрузка на процессор примерно равно нагрузке на прошлом этапе, использовано немного больше оперативной памяти.(относительно предыдущего замера)
![](images/cpu/100.jpg)


Вывод: Для cpu задач увеличение процессов ускоряет выполнение только пока оно не сравняется с количеством физических ядер процессора, после того, как кол-во процессов опережает кол-во физ. ядер производительность начинает падать.
24 changes: 24 additions & 0 deletions check_all_urls.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import time
from urllib.request import Request, urlopen
from urllib.parse import unquote

start = time.time()

with open('res.txt', "r", encoding='utf8') as f:
links = f.readlines()


for url in links:
try:
request = Request(
url,
headers={'User-Agent': 'Mozilla/5.0 (Windows NT 9.0; Win65; x64; rv:97.0) Gecko/20105107 Firefox/92.0'},
)
resp = urlopen(request, timeout=5)
code = resp.code
print(code)
resp.close()
except Exception as e:
print(url, e)

print(f"Время работы: {time.time() - start:.3f} секунд(ы).")
33 changes: 33 additions & 0 deletions check_all_urls_ThreadPoolExecutor.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
import time
import concurrent.futures
from urllib.request import Request, urlopen
from urllib.parse import unquote

start = time.time()
thread_count = 100

with open('res.txt', "r", encoding='utf8') as f:
links = f.readlines()


def check_url(url):
try:
request = Request(
url,
headers={'User-Agent': 'Mozilla/5.0 (Windows NT 9.0; Win65; x64; rv:97.0) Gecko/20105107 Firefox/92.0'},
)
resp = urlopen(request, timeout=5)
code = resp.code
print(code)
resp.close()
except Exception as e:
print(url, e)


with concurrent.futures.ThreadPoolExecutor(thread_count) as executor:
futures = [executor.submit(check_url, url=url) for url in links]
for future in concurrent.futures.as_completed(futures):
future.result()


print(f"Время работы: {time.time() - start} секунд.")
21 changes: 21 additions & 0 deletions cpu_bound.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import time
import random
from hashlib import md5

coins_count = 5
coin_length = 50
digits = "0123456789"
start = time.time()
coins = 0

print(1)
while coins != coins_count:
s = "".join(random.choices(digits, k=coin_length))
h = md5(s.encode('utf8')).hexdigest()

if h.endswith("00000"):
coins += 1
print(s, h)

all_time = time.time() - start
print(f"Время работы: {all_time:.3f} секунд(ы).")
32 changes: 32 additions & 0 deletions cpu_bound_ThreadPoolExecutor.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
import time
import random
import concurrent.futures
from hashlib import md5

thread_count = 100
coins_count = 5
coin_length = 50
digits = "0123456789"
start = time.time()


def generate_coin():
while True:
s = "".join(random.choices(digits, k=coin_length))

h = md5(s.encode('utf8')).hexdigest()

if h.endswith("00000"):
return s, h


print(thread_count)

with concurrent.futures.ThreadPoolExecutor(thread_count) as executor:
futures = [executor.submit(generate_coin) for i in range(coins_count)]
for future in concurrent.futures.as_completed(futures):
print(*future.result())


all_time = time.time() - start
print(f"Время работы: {all_time:.3f} секунд(ы).")
Binary file added images/cpu/1.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added images/cpu/10.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added images/cpu/100.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added images/cpu/2.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added images/cpu/4.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added images/cpu/5.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added images/io/1.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added images/io/10.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added images/io/100.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added images/io/5.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
18 changes: 18 additions & 0 deletions load_wiki_pages.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
from urllib.request import urlopen
from urllib.parse import unquote
from bs4 import BeautifulSoup
from tqdm import tqdm

url = 'https://ru.wikipedia.org/wiki/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%A1%D0%BB%D1%83%D1%87%D0%B0%D0%B9%D0%BD%D0%B0%D1%8F_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0'

res = open('res.txt', 'w', encoding='utf8')

for i in tqdm(range(100)):
html = urlopen(url).read().decode('utf8')
soup = BeautifulSoup(html, 'html.parser')
links = soup.find_all('a')

for l in links:
href = l.get('href')
if href and href.startswith('http') and 'wiki' not in href:
print(href, file=res)
Loading