15
回答
PHP 这两段代码执行效率竟然差了四五倍。---不是提问,只是觉得很出乎意料
滴滴云服务器,限时包月0.9元,为开发者而生>>>   

仅仅是把字符串数组$lines里面的内容连接起来的操作(具体业务中还有其他处理,为了简化,全删除了)。

		$loopCnt = count($lines);
		for ($i = 0; $i < $loopCnt; $i++) {
			$lineAll .= $lines[$i].',';	
		}
		$lineAll = rtrim($lineAll,',')."\r\n" ;

 下面的比上面的快了四五倍

		$loopCnt = count($lines);
		$tpStr = '';
		for ($i = 0; $i < $loopCnt; $i++) {
			$tpStr .= ','.$lines[$i];
		}
		$lineAll .= ltrim($tpStr,',')."\r\n" ;

 

PHP
举报
wsg
发帖于6年前 15回/994阅

以下是问题补充:

  • @wsg :上面只是简化版,实际业务上还有其他处理,所以没有用implode函数 (6年前)
  • @wsg :因为是简化版,所以变量的初始化等等都省略了。。。 (6年前)
共有15个答案 最后回答: 6年前
有没有测试: $lineAll=implode(",",$lines);
--- 共有 1 条评论 ---
wsg你说的这个会更快的。 因为我在链接的时候实际上还有其他处理,所以么有用这个函数。 6年前 回复

第一个没初始化变量, 遍历一遍并且报warn成本比较高(虽然可以抑错)

如1楼所说, 做这个implode才是效率最高的

引用来自“酒逍遥”的答案

使用了临时变量  $tpStr 内存消耗会多一点..

至于效率的话 应该是 php报warning导致的

大家的眼里太厉害了。我还是写得严谨一点吧。

$lines = array(/*一百万个字符串类型的元素*/);
test1($lines);//耗时17秒
test2($lines);//耗时70秒

function test1(array $lines){
	$lineAll = '--';
	
	$loopCnt = count($lines);
	for ($i = 0; $i < $loopCnt; $i++) {
		$lineAll .= myFunc($lines[$i].',');
	}
	$lineAll .= rtrim($lineAll,',')."\r\n" ;
}

function test2(array $lines){
	$lineAll = '--';
	$tpStr = '';
	
	$loopCnt = count($lines);
	for ($i = 0; $i < $loopCnt; $i++) {
		$tpStr .= ','.myFunc($lines[$i]);
	}
	$lineAll .= ltrim($tpStr,',')."\r\n" ;
}

function myFunc($line){
	//一堆处理后,返回一个字符串
}

--- 共有 1 条评论 ---
mahone提供的这个版本,好像没什么差别啊。。。 6年前 回复

引用来自“wsg”的答案

引用来自“酒逍遥”的答案

使用了临时变量  $tpStr 内存消耗会多一点..

至于效率的话 应该是 php报warning导致的

大家的眼里太厉害了。我还是写得严谨一点吧。

$lines = array(/*一百万个字符串类型的元素*/);
test1($lines);//耗时17秒
test2($lines);//耗时70秒

function test1(array $lines){
	$lineAll = '--';
	
	$loopCnt = count($lines);
	for ($i = 0; $i < $loopCnt; $i++) {
		$lineAll .= myFunc($lines[$i].',');
	}
	$lineAll .= rtrim($lineAll,',')."\r\n" ;
}

function test2(array $lines){
	$lineAll = '--';
	$tpStr = '';
	
	$loopCnt = count($lines);
	for ($i = 0; $i < $loopCnt; $i++) {
		$tpStr .= ','.myFunc($lines[$i]);
	}
	$lineAll .= ltrim($tpStr,',')."\r\n" ;
}

function myFunc($line){
	//一堆处理后,返回一个字符串
}

我测试了一下 耗时差不多啊..是不是 你的myFunc 耗时不一样啊..

测试代码如下

$lines = range(1,1000000);

$time=microtime(true);
test1($lines);
$time1=microtime(true);
test2($lines);
$time2=microtime(true);

echo "test1 function take ".($time1-$time)." \r\n";
echo "test2 function take ".($time2-$time1)." \r\n";

function test1(array $lines){
	$lineAll = '--';
	
	$loopCnt = count($lines);
	for ($i = 0; $i < $loopCnt; $i++) {
		$lineAll .= myFunc($lines[$i],',');
	}
	$lineAll .= rtrim($lineAll,',')."\r\n" ;
}

function test2(array $lines){
	$lineAll = '--';
	$tpStr = '';
	
	$loopCnt = count($lines);
	for ($i = 0; $i < $loopCnt; $i++) {
		$tpStr .= ','.myFunc($lines[$i]);
	}
	$lineAll .= ltrim($tpStr,',')."\r\n" ;
}

function myFunc($line){
	return $line;
}

结果输出为

test1 function take 3.26807379723
test2 function take 3.26009106636

唯一的区别好像 就是 test1  是先把逗号附加在变量后面然后传递给函数

test2 则是把逗号附加在函数返回值的前面...

引用来自“酒逍遥”的答案

引用来自“wsg”的答案

引用来自“酒逍遥”的答案

使用了临时变量  $tpStr 内存消耗会多一点..

至于效率的话 应该是 php报warning导致的

大家的眼里太厉害了。我还是写得严谨一点吧。

$lines = array(/*一百万个字符串类型的元素*/);
test1($lines);//耗时17秒
test2($lines);//耗时70秒

function test1(array $lines){
	$lineAll = '--';
	
	$loopCnt = count($lines);
	for ($i = 0; $i < $loopCnt; $i++) {
		$lineAll .= myFunc($lines[$i].',');
	}
	$lineAll .= rtrim($lineAll,',')."\r\n" ;
}

function test2(array $lines){
	$lineAll = '--';
	$tpStr = '';
	
	$loopCnt = count($lines);
	for ($i = 0; $i < $loopCnt; $i++) {
		$tpStr .= ','.myFunc($lines[$i]);
	}
	$lineAll .= ltrim($tpStr,',')."\r\n" ;
}

function myFunc($line){
	//一堆处理后,返回一个字符串
}

我测试了一下 耗时差不多啊..是不是 你的myFunc 耗时不一样啊..

测试代码如下

$lines = range(1,1000000);

$time=microtime(true);
test1($lines);
$time1=microtime(true);
test2($lines);
$time2=microtime(true);

echo "test1 function take ".($time1-$time)." \r\n";
echo "test2 function take ".($time2-$time1)." \r\n";

function test1(array $lines){
	$lineAll = '--';
	
	$loopCnt = count($lines);
	for ($i = 0; $i < $loopCnt; $i++) {
		$lineAll .= myFunc($lines[$i],',');
	}
	$lineAll .= rtrim($lineAll,',')."\r\n" ;
}

function test2(array $lines){
	$lineAll = '--';
	$tpStr = '';
	
	$loopCnt = count($lines);
	for ($i = 0; $i < $loopCnt; $i++) {
		$tpStr .= ','.myFunc($lines[$i]);
	}
	$lineAll .= ltrim($tpStr,',')."\r\n" ;
}

function myFunc($line){
	return $line;
}

结果输出为

test1 function take 3.26807379723
test2 function take 3.26009106636

OSC的兄弟们太认真,以后再也不敢随便乱放贴了。

是我给的那个简化版不是很严谨,下面把我实际用到的大概代码给出来。(借用@酒逍遥 的格式)

$source = '一个含有一百万行数据的csv文件';

$time=microtime(true);
test1($source);
$time1=microtime(true);
test2($source);
$time2=microtime(true);

echo "test1 function take ".($time1-$time)." \r\n";
echo "test2 function take ".($time2-$time1)." \r\n";

function test1($source){

	$fileR = fopen($source, 'r');
	$n = 0;
	$lineAll = '';
	while (($line = fgetcsv($fileR))) {

		//↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓只有这里面的不一样↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
		$tpStr = '';
		for ($i = 0; $i < 4; $i++) {
			$tpStr .= ','.myFunc($line[$i]);
		}
		$lineAll .= ltrim($tpStr,',')."\r\n" ;
		//↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑

		if(($n++) % 10000 == 0){
			myFunc2($lineAll);
			$lineAll = '';
		}
	}

	if(isset($fileR)){
		fclose($fileR);
	}

}

function test2($source){
	$fileR = fopen($source, 'r');
	$n = 0;
	$lineAll = '';
	while (($line = fgetcsv($fileR))) {
		
		//↓↓↓↓↓↓↓↓↓↓↓↓↓↓只有这里面的不一样↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
		for ($i = 0; $i < 4; $i++) {
			$lineAll .= myFunc($line[$i]).',';
		}
		$lineAll = rtrim($lineAll,',')."\r\n" ;
		//↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑

		if(($n++) % 10000 == 0){
			myFunc2($lineAll);
			$lineAll = '';
		}
	}

	if(isset($fileR)){
		fclose($fileR);
	}

}

function myFunc($line){
	return $line;
}

function myFunc2($lineAll){
	//
}

输出结果:
test1 function take 12.884254217148
test2 function take 67.784549951553
顶部