【发布时间】:2012-07-05 23:46:26
【问题描述】:
我有一个类正在使用存储在数组中的数据构建一些 HTML。该数组中大约有 100 个项目。每个项目都包含公司名称、描述和公司支持的不同编程语言的标志等信息。我在为每个项目构建 HTML 时进行字符串连接。
我注意到,当我附加编程语言数据时,性能突然受到了巨大的影响。我看到页面渲染计时器从 0.15 秒跳到 ~0.60 秒。这个时间包括每次从数据库中抓取相同的数据。我可以始终使性能在这 2 次之间跳跃,但注释/取消注释以下代码行:
$html .= '<div class="programmingLanguages"><strong>Programming Languages</strong> '.implode(', ', $progLanguagesArray).'</div>';
通过附加一个长测试字符串,我也能够获得相同的性能下降,如下所示:
$html .= 'testtesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttest';
特别奇怪的是,我还有另一行代码使用相同的“内爆”函数,并且在性能上没有任何显着差异:
$html .= '<div class="integrationMethods"><strong>Integration Methods:</strong> '.implode(', ', $intMethodsArray).'</div>';
有人对这里可能发生的事情有任何见解吗?我在我的代码的其他地方做了大量这样的连接,以前从未见过这样的东西。在这一点上,我被难住了。
这是完整的课程:
class DeveloperView {
public static function getHtml($developers) {
$html = '';
$html .= '<div>';
$html .= '<div>';
$count = 0;
foreach ($developers as $developer) {
$url = $developer['attributes']['url'];
$phone = $developer['attributes']['phone'];
$company = $developer['attributes']['desc'];
$active = $developer['attributes']['active'];
$desc = $developer['object_value'];
$intMethodsArray = array();
if ($developer['attributes']['m1']) { $intMethodsArray[] = 'method 1'; }
if ($developer['attributes']['m2']) { $intMethodsArray[] = 'method 2'; }
if ($developer['attributes']['m3']) { $intMethodsArray[] = 'method 3'; }
if ($developer['attributes']['m4']) { $intMethodsArray[] = 'method 4'; }
if ($developer['attributes']['m5']) { $intMethodsArray[] = 'method 5'; }
$progLanguagesArray = array();
if ($developer['attributes']['dotnet']) { $progLanguagesArray[] = '.Net (C# or VB.Net)'; }
if ($developer['attributes']['asp']) { $progLanguagesArray[] = 'Classic ASP'; }
if ($developer['attributes']['cf']) { $progLanguagesArray[] = 'Cold Fusion'; }
if ($developer['attributes']['java']) { $progLanguagesArray[] = 'Java'; }
if ($developer['attributes']['php']) { $progLanguagesArray[] = 'PHP'; }
if ($developer['attributes']['perl']) { $progLanguagesArray[] = 'Perl'; }
if ($developer['attributes']['other']) { $progLanguagesArray[] = 'Other'; }
$html .= '<div class="';
if ($count % 2 == 0) {
$html .= 'listingalt';
} else {
$html .= 'listing';
}
$html .= '">';
$html .= '<div class="developerPhone">'.$phone.'</div>';
$html .= '<a class="ext_link" target="_blank" href="'.$url.'">'.$company.'</a>';
$html .= '<div>';
if (!empty($intMethodsArray)) {
$html .= '<div class="integrationMethods"><strong>Integration Methods:</strong> '.implode(', ', $intMethodsArray).'</div>';
}
if (!empty($progLanguagesArray)) {
$html .= '<div class="programmingLanguages"><strong>Programming Languages</strong> '.implode(', ', $progLanguagesArray).'</div>';
}
$html .= '</div>';
$html .= '<p>'.$desc.'</p>';
$html .= '</div>'."\n";
$count++;
}
$html .= '</div></div>';
return $html;
}
}
【问题讨论】:
-
您是否尝试了几次以获得平均值和标准偏差?如果您直接回显您的文字?你的操作系统、配置是什么?
-
操作系统为 Solaris 10,PHP 版本 5.2.9。我没有计算平均/标准偏差,但是在测试我知道命中不是来自其他地方的时候已经得到了足够一致的时间。虽然这段代码可能只是导致其他地方出现问题的起点......
-
经过更多测试和使用不同的计时方法后,我认为问题不一定与此代码有关,而是计时器中的错误。我在 Firebug 的 net 选项卡中看到一致的发送/等待/接收时间。我将继续对时序代码进行故障排除。感谢所有花时间阅读我的问题的人。
-
我只是想为可能遇到此问题的任何人提供更新。我的计时器中确实有一个“错误”,因为它正在计算 HTML 回显之后的结束处理时间。因此,发送到浏览器的数据量会影响处理时间,我希望在传输任何数据之前看到处理时间。
标签: php string performance