0
我正在做一個解碼編碼密碼的腳本,以便我可以看到原始密碼。問題是順序碼比多線程碼快。順序碼持續12秒,多線程持續20秒。爲什麼?Bash多線程速度問題
我正在使用8 GB Ram + i5-2450M(4CPU〜2,4Ghz)+ SSD的基本OS 64位(ubuntu 14.04)上執行。
序列碼。
#!/bin/bash
space="a b c d e f g h i j k l m n o p q r s t u v w x y z"
if [ $# -le 1 ]
then
echo "Ussage: " $0 SALT PASSWORD_CODED
exit
fi
echo $2
echo $1
for i in $space
do
for j in $space
do
for k in $space
do
#echo $i$j$k
variable=$(openssl passwd -crypt -salt "$1" "$i$j$k")
if [ "$variable" = $2 ]
then
echo password found: $i$j$k
exit
fi
done
done
done
多線程代碼。
space="a b c d e f g h i j k l m n o p q r s t u v w x y z"
if [ $# -le 1 ]
then
echo "Ussage: " $0 SALT PASSWORD_CODED
exit
fi
calculate1()
{
for i in $space
do
for j in $space
do
for k in $space
do
variable=$(openssl passwd -crypt -salt "$1" "$k$j$i")
if [ "$variable" = $2 ]
then
echo password found: $k$j$i
date
exit
fi
done
done
done
}
calculate2()
{
for i in $space
do
for j in $space
do
for k in $space
do
variable2=$(openssl passwd -crypt -salt "$1" "$i$j$k")
if [ "$variable2" = $2 ]
then
echo password found: $i$j$k
date
exit
fi
done
done
done
}
date
calculate1 $1 $2 &
calculate2 $1 $2 &
echo waiting
wait
爲什麼單線程和順序碼更快?
我可以使用C代碼而不是bash嗎? 與C中的variable2=$(openssl passwd -crypt -salt "$1" "$i$j$k")
類似嗎?
你一定要明白,你的水貨版本不分區這兩個過程之間的工作,而是讓每個人都完成所有的工作? – ruakh
是的,但我認爲兩者工作在相同的速度。第一個從左側開始,第二個從右側開始。所以當他們完成了一半的工作時,他們已經有了密碼並且打印了它,因爲他們通過了所有組合 – user2911701
,如果兩個「進程」試圖找到相同的答案,一個從左邊開始,另一個在右邊,那麼假設是不正確的兩個過程的速度都是一樣的。從右側開始的「序列代碼」運行一次流程,看看需要多長時間,我認爲這將花費接近20秒。 (想想這是爲什麼,並找到一個更好的方式來分裂你的工作。)正如前面在評論中提到的,你不是分裂工作負荷,如果你真的要這樣拆分它,你可能會增加或減少找到回答更快。 – jkdba