小编Fab*_*zio的帖子

什么是更快:in_array或isset?

这个问题仅供我使用,因为我总是喜欢编写优化的代码,这些代码也可以在便宜的慢速服务器(或具有大量流量的服务器)上运行

我环顾四周,无法找到答案.我想知道这两个例子之间的速度有多快,记住我的情况下数组的键并不重要(伪代码自然):

<?php
$a = array();
while($new_val = 'get over 100k email addresses already lowercased'){
    if(!in_array($new_val, $a){
        $a[] = $new_val;
        //do other stuff
    }
}
?>

<?php
$a = array();
while($new_val = 'get over 100k email addresses already lowercased'){
    if(!isset($a[$new_val]){
        $a[$new_val] = true;
        //do other stuff
    }
}
?>
Run Code Online (Sandbox Code Playgroud)

由于问题的关键不在于数组冲突,我想补充一点,如果你害怕碰撞插入$a[$new_value],你可以使用$a[md5($new_value)].它仍然可能导致冲突,但是当从用户提供的文件中读取时会从可能的DoS攻击中消失(http://nikic.github.com/2011/12/28/Supercolliding-a-PHP-array.html)

php performance micro-optimization

91
推荐指数
4
解决办法
4万
查看次数

Google Cloud SQL非常慢

我正在考虑将我的网站迁移到Google Cloud SQL,然后我注册了一个免费帐户(D32).

在有23k记录的桌子上进行测试时,性能非常差,所以我读到如果我从免费帐户转到完全付费帐户,我可以访问更快的CPU和HDD ...所以我做到了.

表演仍然非常糟糕.

我正在运行我自己的MySQL服务器多年,根据需要升级以处理越来越多的连接并获得原始速度(由于遗留应用程序需要).我高度优化表,配置和大量使用查询缓存等...

我们遗留系统的几页每页有超过1.5k的查询,目前我能够将所有查询的mysql查询时间(执行和拉动数据)推迟到3.6秒,这意味着MySQL需要大约0.0024秒执行查询并返回值..不是最大但可接受的那些页面.

我将涉及这些问题的表格上传到Google Cloud SQL.我注意到INSERT已经执行SECONDS而不是毫秒......但我认为它可能是syncvs async设置.我将其更改为async并且插入的执行时间不会改变.现在不是一个大问题,我现在只测试查询.

我运行一个简单的select * FROM <table>,我注意到它需要超过6秒..我认为可能查询缓存需要构建..我再试一次,这次需要4秒(不包括网络流量).重启后我在备份服务器上运行相同的查询,根本没有连接,只需不到1秒......再次运行,0.06秒.

也许问题是缓存,太大了......让我们尝试一个较小的子集

select * from <table> limit 5;

  • 到我的服务器:0.00秒
  • GCS:0.04

所以我决定在空桌上尝试一个愚蠢的选择,根本没有记录,只用1个字段创建

  • 到我的服务器:0.00秒
  • GCS:0.03

分析不会提供任何见解,除了查询缓存没有在Google Cloud SQL上运行,并且查询执行似乎更快但......不...

我的服务器:

mysql> show profile;
+--------------------------------+----------+
| Status                         | Duration |
+--------------------------------+----------+
| starting                       | 0.000225 |
| Waiting for query cache lock   | 0.000116 |
| init                           | 0.000115 |
| checking query cache for query | 0.000131 |
| checking permissions …
Run Code Online (Sandbox Code Playgroud)

google-cloud-sql

10
推荐指数
1
解决办法
2783
查看次数

在php中重置for循环的指针

给出以下代码

<?php
$a = array(1,2,3,4,5,6);
$c=0;
foreach($a as $v){
    if($v==5&&$c==0){
        $c=1;
        reset($a);
    }
    var_dump($v);
}
Run Code Online (Sandbox Code Playgroud)

如何重置指针以便打印1,2,3,4,5,1,2,3,4,5,6?

我知道在这种情况下我可以简单地说

<?php
$a = array(1,2,3,4,5,6);
$c=0;
for($i=0;$i<count($a);++$i){
    $v = $a[$i];
    if($v==5&&$c==0){
        $c=1;
        $i=-1;  //because of the loop ++$i
    }
    var_dump($v);
}
Run Code Online (Sandbox Code Playgroud)

但是我有一个更复杂的代码片段,解决方案并不像重写循环那样简单(不是数字键).

任何PHP大师都可以帮助我吗?

php for-loop

3
推荐指数
1
解决办法
983
查看次数

PHP 中哪个更快:!!或(布尔)?

我正在尝试对代码进行微优化,我想知道将变量转换为布尔值哪个更快:

<?php
$a='test';
$result1 = !!$a;
$result2 = (bool)$a;
?>
Run Code Online (Sandbox Code Playgroud)

我不担心代码大小,只担心执行时间。

这里有一些基准,但它非常不确定(尝试了多次),所以我想知道 PHP 的源代码中会发生什么,看看它们是否有不同的处理方式:

<?php
$a = 'test';
for($c=0;$c<3;$c++){
    $start = microtime(true);
    for($i=0;$i<10000000;$i++){
        $result = !!$a;
    }
    $end =  microtime(true);
    $delta = $end-$start;
    echo '!!: '.$delta.'<br />';
}
$a = 'test';
for($c=0;$c<3;$c++){
    $start = microtime(true);
    for($i=0;$i<10000000;$i++){
        $result = (bool)$a;
    }
    $end =  microtime(true);
    $delta = $end-$start;
    echo '(bool): '.$delta.'<br />';
}
Run Code Online (Sandbox Code Playgroud)

结果

!!: 0.349671030045
!!: 0.362552021027
!!: 0.351779937744
(bool): 0.346690893173
(bool): 0.36114192009
(bool): 0.373970985413
Run Code Online (Sandbox Code Playgroud)

php boolean micro-optimization

-2
推荐指数
1
解决办法
228
查看次数