之前写过一个 多进程-100万个数的排序,效果很明显,今天看看php多线程的性能如何。
搞10万个算了,本机性能有限,虚拟机,单核cpu
input.php --------------------------------------------
<?php
/**
+----------------------------------------------------------
* date: 2019-04-19 09:32:09
+----------------------------------------------------------
* author: Raoxiaoya
+----------------------------------------------------------
* describe: 生产100万个整数
+----------------------------------------------------------
*/
$file = './data.txt';
if(file_exists($file)){
unlink($file);
}
touch($file);
$n = 100000; // 10万个
$res = '';
for ($i = 0; $i < $n; $i++) {
$num = rand(1, $n * 10);
$res .= $num . ',';
}
file_put_contents($file, $res);
echo 'ok'.PHP_EOL;
sort.php ----------------------------------------------------
<?php
class Test extends Thread{
public $data;
public $response;
public function __construct($data){
$this->data = $data;
}
public function run(){
$data = (array)$this->data;
$len = count($data);
for ($i = 0; $i < $len - 1; $i++) {
for ($j = 0; $j < $len - $i - 1; $j++) {
if($data[$j] > $data[$j+1]){
$temp = $data[$j];
$data[$j] = $data[$j+1];
$data[$j+1] = $temp;
}
}
}
$this->response = join(',', $data);
}
}
$file = './data.txt';
$result_file = './sort_result.txt';
if(file_exists($result_file)){
unlink($result_file);
}
touch($result_file);
$n = 10;
$count = 100000;
$start = microtime(true);
$cont = file_get_contents($file);
$arr = explode(',', $cont);
$arr = array_filter($arr);
// 找出最大值和最小值
$min = null;
$max = null;
foreach ($arr as $v) {
if(is_null($max) && is_null($min)){
$max = $v;
$min = $v;
}
if($v > $max){
$max = $v;
continue;
}
if($v < $min){
$min = $v;
continue;
}
}
// 分n片
$x = (int)(($max - $min) / $count) * ($count / $n);
$temp = [];
for($i = 0; $i < $n; $i++){
if($i == 0){
$temp[$i] = [$min, $min + $x];
}elseif($i == 9){
$temp[$i] = [$temp[$i - 1][1] + 1, $max];
}else{
$temp[$i] = [$temp[$i - 1][1] + 1, $temp[$i - 1][1] + 1 + $x];
}
}
$tempdata = [];
$resultdata = [];
$resultdatafinal = '';
foreach ($temp as $key => $value) {
$tempdata[$key] = [];
foreach ($arr as $val) {
if($val >= $value[0] && $val <= $value[1]){
array_push($tempdata[$key], $val);
continue;
}
}
}
$p = [];
// 启动十个线程
for ($i = 0; $i < $n; $i++) {
$p[$i] = new Test($tempdata[$i]);
$p[$i]->start();
}
for ($i = 0; $i < $n; $i++) {
$p[$i]->join();
$resultdata[$i] = $p[$i]->response;
}
foreach ($resultdata as $value) {
$resultdatafinal .= $value . ',';
}
file_put_contents($result_file, $resultdatafinal);
echo 'ok'.PHP_EOL;
$end = microtime(true);
echo 'time ' . ($end - $start) . PHP_EOL;
测试:
0、$n=5, $count = 100000; 耗时;76s
1、$n=10, $count = 100000; 耗时;51s
1、$n=20, $count = 100000; 耗时;177s
可见线程数真不能过高,也不宜过低。
于是好奇,使用原始的方式来排序:
也是 10 万个数
nomal.php -------------------------------------------------
<?php
$start = microtime(true);
$file = './data.txt';
$result_file = './sort_result.txt';
if(file_exists($result_file)){
unlink($result_file);
}
touch($result_file);
$cont = file_get_contents($file);
$arr = explode(',', $cont);
$data = array_filter($arr);
$len = count($data);
for ($i = 0; $i < $len - 1; $i++) {
for ($j = 0; $j < $len - $i - 1; $j++) {
if($data[$j] > $data[$j+1]){
$temp = $data[$j];
$data[$j] = $data[$j+1];
$data[$j+1] = $temp;
}
}
}
$resultdatafinal = join(',', $data);
file_put_contents($result_file, $resultdatafinal);
echo 'ok'.PHP_EOL;
$end = microtime(true);
echo 'time ' . ($end - $start) . PHP_EOL;
结果:
时间:490s
可见多线程对性能的提升不止一点半点啊。