Jdi na navigaci předmětu

2. Domácí úkol: Porovnání

using DataFrames, CSV, PyPlot

Import naměřených dat.

data = CSV.read("files/benchmark02.csv", DataFrame);
data[!, :score] = zeros(Int64, nrow(data));

Čas v původních datech je měřen v nanosekundách, paměť v bytech. Každá hodnota je medián několika běhů benchmarku z balíčku BechmarkTools.jl. Všechny výpočty běží na stejných předem vygenerovaných datech a se stejným počátečním nastavením PRNG.

Komentář k jednotlivých sloupců je v příslušné sekci níže.

data = coalesce.(data, 999e99)
17×14 DataFrame
Rowusernamerandomize_periodicrandomize_periodic_memrandomize_fixedrandomize_fixed_memenergy_periodicenergy_periodic_memenergy_fixedenergy_fixed_memevolution_periodicevolution_periodic_memevolution_fixedevolution_fixed_memscore
String15Float64Int64Float64Int64Float64Int64Float64Int64Float64Float64Float64Float64Int64
1kalvotom2.42561e7200000001.96084e7198403205.28643e709.07513e601.92786e6496.09.4502e5496.00
2Zuhgan1.38882e620000481.32805e619841124.62317e607.69932e601.0882e60.09.99e1019.99e1010
3Shum1.7031e601.85951e601.63905e701.36044e705.64068e5496.04.76768e5496.00
4Parfu1.26384e601.25036e608.71313e620000487.3095e620000489.96326e62.00005e68.46145e62.00005e60
5Borkul1.67349e620001281.73498e619841927.77872e6260025288.42986e6259293921.07116e60.01.59849e6479744.00
6Jogug987862.00657463.008.38036e602.64698e609.17525e60.03.01946e60.00
7Wauktug2.35325e7200000001.86072e7198403202.46943e720000481.4021e720000482.43321e70.02.54885e70.00
8Ugghra1.81725e62500961.79426e62481128.59678e7940381448.77562e7800230248.62513e79.47793e71.78556e88.06234e70
9Gilaktug2.88251e620001282.88865e619841921.12575e912138438561.10493e912126872489.99e1019.99e1019.99e1019.99e1010
10Xomkug1.37509e620001281.9081e619841921.0907e7300271208.99903e6259292002.77365e68.04981e64.93034e50.00
11Xunaakt1.40303e620000481.37489e620000481.11213e701.08273e701.01076e6320000.0413549.00.00
12Saghig1.358e620001283.92016e619841125.23231e7520000005.35698e7520000005.44353e75.24895e75.61772e75.24889e70
13Bugharz3.33323e620001283.34088e619841921.63152e7224506408.07758e6103678081.40377e6595520.01.52498e6575040.00
14Saraugug1.63092e60899446.005.0883e601.93096e605.79478e60.01.53793e60.00
15Epkagut3.57635e640716643.57872e640716648.44516e910201571521.13433e1010187543361.61421e101.38795e91.09804e101.38575e90
16Xig2.79644e620001281.84892e619842563.09434e620000484.95292e620000485.66954e94.00018e96.06057e94.00018e90
17Quordud2.60039e602.04182e601.31842e702.32202e720000485.86705e104.0008e61.18859e111.17803e100

Poznámky

  • Vedle studentů je v tabulce i můj řádek (kalvotom).
  • Pro lepší porovnání časů provedem vždy relativní porovnání s nejrychlejším časem. Měníme proto hodnoty a význam časových sloupců!

Randomizace pomocí randomize!

Pro měření (i v dalších sekcích níže) je použita mřížka 500×500500 \times 500. Nejprve model s periodickými hraničními podmínkami.

data[!, :randomize_periodic] /= minimum(data.randomize_periodic);
sort!(data, [:randomize_periodic]);

for k in axes(data, 1)
    data[k, :score] += k
end

data[:, Cols(:username, :randomize_periodic, :randomize_periodic_mem, :score)]
17×4 DataFrame
Rowusernamerandomize_periodicrandomize_periodic_memscore
String15Float64Int64Int64
1Jogug1.001
2Parfu1.2793602
3Saghig1.3746920001283
4Xomkug1.3919820001284
5Zuhgan1.4058820000485
6Xunaakt1.4202720000486
7Saraugug1.6509607
8Borkul1.6940520001288
9Shum1.7240309
10Ugghra1.8395825009610
11Quordud2.63234011
12Xig2.8308200012812
13Gilaktug2.91793200012813
14Bugharz3.37419200012814
15Epkagut3.6203407166415
16Wauktug23.82172000000016
17kalvotom24.55422000000017

Relativní porovnání rychlosti běhu vzhledem k nejrychlejšímu řešení.

plt.grid()
bar(axes(data.randomize_periodic, 1), data.randomize_periodic, tick_label=data.username)
plt.xticks(rotation=80);

Odhad alokace paměti (v bytech).

plt.grid()
bar(axes(data.randomize_periodic_mem, 1), data.randomize_periodic_mem, tick_label=data.username)
plt.xticks(rotation=80);

A nyní pevné hraniční podmínky.

data[!, :randomize_fixed] /= minimum(data.randomize_fixed);
sort!(data, [:randomize_fixed]);

for k in axes(data, 1)
    data[k, :score] += k
end

data[:, Cols(:username, :randomize_fixed, :randomize_fixed_mem, :score)]
17×4 DataFrame
Rowusernamerandomize_fixedrandomize_fixed_memscore
String15Float64Int64Int64
1Jogug1.002
2Saraugug1.3680609
3Parfu1.901805
4Zuhgan2.0199619841129
5Xunaakt2.0912200004811
6Borkul2.6389198419214
7Ugghra2.7290724811217
8Xig2.8122198425620
9Shum2.82832018
10Xomkug2.90222198419214
11Quordud3.1056022
12Gilaktug4.39364198419225
13Bugharz5.08147198419227
14Epkagut5.44322407166429
15Saghig5.96255198411218
16Wauktug28.30151984032032
17kalvotom29.82431984032034

Relativní porovnání rychlosti běhu vzhledem k nejrychlejšímu řešení.

plt.grid()
bar(axes(data.randomize_fixed, 1), data.randomize_fixed, tick_label=data.username)
plt.xticks(rotation=80);

Odhad alokace paměti (v bytech).

plt.grid()
bar(axes(data.randomize_fixed_mem, 1), data.randomize_fixed_mem, tick_label=data.username)
plt.xticks(rotation=80);

Výpočet energie pomocí energy

Nejprve model s periodickými hraničními podmínkami.

data[!, :energy_periodic] /= minimum(data.energy_periodic);
sort!(data, [:energy_periodic]);

for k in axes(data, 1)
    data[k, :score] += k
end

data[:, Cols(:username, :energy_periodic, :energy_periodic_mem, :score)]
17×4 DataFrame
Rowusernameenergy_periodicenergy_periodic_memscore
String15Float64Int64Int64
1Xig1.0200004821
2Zuhgan1.49407011
3Saraugug1.64439012
4Borkul2.513852600252818
5Jogug2.7082907
6Parfu2.81583200004811
7Xomkug3.524843002712021
8Xunaakt3.59408019
9Quordud4.26073031
10Bugharz5.272592245064037
11Shum5.29694029
12Wauktug7.98047200004844
13Saghig16.90935200000031
14kalvotom17.0842048
15Ugghra27.78239403814432
16Gilaktug363.809121384385641
17Epkagut2729.23102015715246

Relativní porovnání rychlosti běhu vzhledem k nejrychlejšímu řešení.

plt.grid()
bar(axes(data.energy_periodic, 1), data.energy_periodic, tick_label=data.username)
plt.xticks(rotation=80);

Odhad alokace paměti (v bytech).

plt.grid()
bar(axes(data.energy_periodic_mem, 1), data.energy_periodic_mem, tick_label=data.username)
plt.xticks(rotation=80);

A nyní pevné hraniční podmínky.

data[!, :energy_fixed] /= minimum(data.energy_fixed);
sort!(data, [:energy_fixed]);

for k in axes(data, 1)
    data[k, :score] += k
end

data[:, Cols(:username, :energy_fixed, :energy_fixed_mem, :score)]
17×4 DataFrame
Rowusernameenergy_fixedenergy_fixed_memscore
String15Float64Int64Int64
1Saraugug1.0013
2Jogug1.3708109
3Xig2.56501200004824
4Parfu3.78543200004815
5Zuhgan3.98731016
6Bugharz4.18321036780843
7Borkul4.365642592939225
8Xomkug4.66042592920029
9kalvotom4.69981057
10Xunaakt5.60723029
11Shum7.04544040
12Wauktug7.26116200004856
13Quordud12.0252200004844
14Saghig27.74265200000045
15Ugghra45.4478002302447
16Gilaktug572.221121268724857
17Epkagut5874.44101875433663

Relativní porovnání rychlosti běhu vzhledem k nejrychlejšímu řešení.

plt.grid()
bar(axes(data.energy_fixed, 1), data.energy_fixed, tick_label=data.username)
plt.xticks(rotation=80);

Odhad alokace paměti (v bytech).

plt.grid()
bar(axes(data.energy_fixed_mem, 1), data.energy_fixed_mem, tick_label=data.username)
plt.xticks(rotation=80);

Výpočet časového vývoje pomocí evolve!

Nejprve model s periodickými hraničními podmínkami.

data[!, :evolution_periodic] /= minimum(data.evolution_periodic);
sort!(data, [:evolution_periodic]);

for k in axes(data, 1)
    data[k, :score] += k
end

data[:, Cols(:username, :evolution_periodic, :evolution_periodic_mem, :score)]
17×4 DataFrame
Rowusernameevolution_periodicevolution_periodic_memscore
String15Float64Float64Int64
1Shum1.0496.041
2Xunaakt1.79191320000.031
3Borkul1.898990.028
4Zuhgan1.92920.020
5Bugharz2.48865595520.048
6kalvotom3.41778496.063
7Xomkug4.917228.04981e636
8Saraugug10.27320.021
9Jogug16.26620.018
10Parfu17.66322.00005e625
11Wauktug43.13690.067
12Saghig96.50485.24895e757
13Ugghra152.9099.47793e760
14Xig10051.24.00018e938
15Epkagut28617.21.38795e978
16Quordud1.04013e54.0008e660
17Gilaktug1.77106e969.99e10174

Relativní porovnání rychlosti běhu vzhledem k nejrychlejšímu řešení.

plt.grid()
bar(axes(data.evolution_periodic, 1), data.evolution_periodic, tick_label=data.username)
plt.xticks(rotation=80);

Odhad alokace paměti (v bytech).

plt.grid()
bar(axes(data.evolution_periodic_mem, 1), data.evolution_periodic_mem, tick_label=data.username)
plt.xticks(rotation=80);

A nyní pevné hraniční podmínky.

data[!, :evolution_fixed] /= minimum(data.evolution_fixed);
sort!(data, [:evolution_fixed]);

for k in axes(data, 1)
    data[k, :score] += k
end

data[:, Cols(:username, :evolution_fixed, :evolution_fixed_mem, :score)]
17×4 DataFrame
Rowusernameevolution_fixedevolution_fixed_memscore
String15Float64Float64Int64
1Xunaakt1.00.032
2Shum1.15287496.043
3Xomkug1.19220.039
4kalvotom2.28515496.067
5Bugharz3.68754575040.053
6Saraugug3.718860.027
7Borkul3.8653479744.035
8Jogug7.301330.026
9Parfu20.46062.00005e634
10Wauktug61.63370.077
11Saghig135.8425.24889e768
12Ugghra431.7658.06234e772
13Xig14655.04.00018e951
14Epkagut26551.61.38575e992
15Quordud2.87412e51.17803e1075
16Zuhgan2.41568e969.99e10136
17Gilaktug2.41568e969.99e10191

Relativní porovnání rychlosti běhu vzhledem k nejrychlejšímu řešení.

plt.grid()
bar(axes(data.evolution_fixed, 1), data.evolution_fixed, tick_label=data.username)
plt.xticks(rotation=80);

Odhad alokace paměti (v bytech).

plt.grid()
bar(axes(data.evolution_fixed_mem, 1), data.evolution_fixed_mem, tick_label=data.username)
plt.xticks(rotation=80);

Skóre (čím menší hodnota, tím lépe)

sort!(data, :score)
data[:, :points] = zeros(Int64, nrow(data))

n = 0
for k in axes(data, 1)
    # kalvotom se nepočíta, zbývá 14 studentů
    if data[k, :username] == "kalvotom"
        continue
    end
    
    data[k, :points] = 5 - div(n, 4)
    n += 1
end

data[:, Cols(:username, :score, :points)]
17×3 DataFrame
Rowusernamescorepoints
String15Int64Int64
1Jogug265
2Saraugug275
3Xunaakt325
4Parfu345
5Borkul354
6Zuhgan364
7Xomkug394
8Shum434
9Xig513
10Bugharz533
11kalvotom670
12Saghig683
13Ugghra723
14Quordud752
15Wauktug772
16Gilaktug912
17Epkagut922