php多线程-100万个数的排序

之前写过一个 多进程-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
可见多线程对性能的提升不止一点半点啊。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值