Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将MySQL tinyint布尔值(0/1)转换为PHP布尔值(真/假)_Php_Mysql_Performance_Type Conversion_Performance Testing - Fatal编程技术网

将MySQL tinyint布尔值(0/1)转换为PHP布尔值(真/假)

将MySQL tinyint布尔值(0/1)转换为PHP布尔值(真/假),php,mysql,performance,type-conversion,performance-testing,Php,Mysql,Performance,Type Conversion,Performance Testing,我需要反复地将MySQL tinyint(1)'boolean'数据类型转换为PHP布尔值,我一直在尝试最快的方法来实现这一点。我的数据映射如下: echo 'Current PHP Version: ' . phpversion() . '<br /><br />'; $start1 = 1; $start0 = 0; $time_start = microtime(TRUE); for( $i = 0 ; $i < 8500000; $i++ ) {

我需要反复地将MySQL tinyint(1)'boolean'数据类型转换为PHP布尔值,我一直在尝试最快的方法来实现这一点。我的数据映射如下:

echo 'Current PHP Version: ' . phpversion() . '<br /><br />';
$start1 = 1;
$start0 = 0;

$time_start = microtime(TRUE);
for( $i = 0 ; $i < 8500000; $i++ )
{
    $answer = !empty($start1);
    $answer = !empty($start2);  
}
$time_end = microtime(TRUE);
echo 'Did NOT EMPTY in ' . ($time_end - $time_start) . " seconds<br>";

$time_start = microtime(TRUE);
for( $i = 0 ; $i < 8500000; $i++ )
{
    $answer = (bool)$start1;
    $answer = (bool)$start2;    
}
$time_end = microtime(TRUE);
echo 'Did TYPECAST BOOL in ' . ($time_end - $time_start) . " seconds<br>";

$time_start = microtime(TRUE);
for( $i = 0 ; $i < 8500000; $i++ )
{
    $answer = $start1 == TRUE;
    $answer = $start2 == TRUE;  
}
$time_end = microtime(TRUE);
echo 'Did EQUALS TRUE in ' . ($time_end - $time_start) . " seconds<br>";

$time_start = microtime(TRUE);
for( $i = 0 ; $i < 8500000; $i++ )
{
    $answer = !!$start1;
    $answer = !!$start2;    
}
$time_end = microtime(TRUE);
echo 'Did NOT NOT in ' . ($time_end - $time_start) . " seconds<br>";

$time_start = microtime(TRUE);
for( $i = 0 ; $i < 8500000; $i++ )
{
    $answer = is_null($start1);
    $answer = is_null($start2);     
}
$time_end = microtime(TRUE);
echo 'Did IS NULL in ' . ($time_end - $time_start) . " seconds<br>";
Current PHP Version: 5.4.16

Did NOT EMPTY in 1.00608086586 seconds
Did TYPECAST BOOL in 2.5599420070648 seconds
Did EQUALS TRUE in 2.7039749622345 seconds
Did NOT NOT in 2.7622299194336 seconds
Did IS NULL in 4.1728219985962 seconds
  • 空=假
  • 0=错误
  • 1=正确
在环顾四周几个小时后,我似乎找不到任何关于这方面的性能解释/评论,所以我去尝试自己制定一个可能的解决方案。我的代码如下:

echo 'Current PHP Version: ' . phpversion() . '<br /><br />';
$start1 = 1;
$start0 = 0;

$time_start = microtime(TRUE);
for( $i = 0 ; $i < 8500000; $i++ )
{
    $answer = !empty($start1);
    $answer = !empty($start2);  
}
$time_end = microtime(TRUE);
echo 'Did NOT EMPTY in ' . ($time_end - $time_start) . " seconds<br>";

$time_start = microtime(TRUE);
for( $i = 0 ; $i < 8500000; $i++ )
{
    $answer = (bool)$start1;
    $answer = (bool)$start2;    
}
$time_end = microtime(TRUE);
echo 'Did TYPECAST BOOL in ' . ($time_end - $time_start) . " seconds<br>";

$time_start = microtime(TRUE);
for( $i = 0 ; $i < 8500000; $i++ )
{
    $answer = $start1 == TRUE;
    $answer = $start2 == TRUE;  
}
$time_end = microtime(TRUE);
echo 'Did EQUALS TRUE in ' . ($time_end - $time_start) . " seconds<br>";

$time_start = microtime(TRUE);
for( $i = 0 ; $i < 8500000; $i++ )
{
    $answer = !!$start1;
    $answer = !!$start2;    
}
$time_end = microtime(TRUE);
echo 'Did NOT NOT in ' . ($time_end - $time_start) . " seconds<br>";

$time_start = microtime(TRUE);
for( $i = 0 ; $i < 8500000; $i++ )
{
    $answer = is_null($start1);
    $answer = is_null($start2);     
}
$time_end = microtime(TRUE);
echo 'Did IS NULL in ' . ($time_end - $time_start) . " seconds<br>";
Current PHP Version: 5.4.16

Did NOT EMPTY in 1.00608086586 seconds
Did TYPECAST BOOL in 2.5599420070648 seconds
Did EQUALS TRUE in 2.7039749622345 seconds
Did NOT NOT in 2.7622299194336 seconds
Did IS NULL in 4.1728219985962 seconds
我选择了850万次迭代,因为我通常喜欢将最快的测试带到尽可能接近1秒的位置,以便一目了然地看到扩展。从这个测试看来,最好的选择是!空白($value),空白的幅度令人印象深刻

我发布这篇文章是为了分享我的发现,看看是否有其他人知道一种不同的方法可以更快地获得相同的结果,或者这是否会在未来的PHP版本中发生根本性的变化。我们目前处于5.4环境中,希望在明年移植到5.6,并希望最终看到php7

这些方法中是否有一种在新版本的PHP中胜出的方式不同,或者是否有一种完全不同的方式来实现这一点,而我却没有?谢谢你的洞察力

编辑:

正如所指出的,上述测试是不正确的。正确的测试和附加选项如下所示:

echo 'Current PHP Version: ' . phpversion() . '<br /><br />';

$start1 = 1;
$start0 = 0;

$time_start = microtime(TRUE);
for( $i = 0 ; $i < 14000000; $i++ )
{
    $answer = $start1 == 1;
    $answer = $start0 == 1;     
}
$time_end = microtime(TRUE);
echo 'Did EQUALS 1 in ' . ($time_end - $time_start) . " seconds<br>";

$time_start = microtime(TRUE);
for( $i = 0 ; $i < 14000000; $i++ )
{
    $answer = (bool)$start1;
    $answer = (bool)$start0;    
}
$time_end = microtime(TRUE);
echo 'Did TYPECAST BOOL in ' . ($time_end - $time_start) . " seconds<br>";

$time_start = microtime(TRUE);
for( $i = 0 ; $i < 14000000; $i++ )
{
    $answer = $start1 == TRUE;
    $answer = $start0 == TRUE;  
}
$time_end = microtime(TRUE);
echo 'Did EQUALS TRUE in ' . ($time_end - $time_start) . " seconds<br>";

$time_start = microtime(TRUE);
for( $i = 0 ; $i < 14000000; $i++ )
{
    $answer = !!$start1;
    $answer = !!$start0;    
}
$time_end = microtime(TRUE);
echo 'Did NOT NOT in ' . ($time_end - $time_start) . " seconds<br>";

$time_start = microtime(TRUE);
for( $i = 0 ; $i < 14000000; $i++ )
{
    $answer = !empty($start1);
    $answer = !empty($start0);  
}
$time_end = microtime(TRUE);
echo 'Did NOT EMPTY in ' . ($time_end - $time_start) . " seconds<br>";

$time_start = microtime(TRUE);
for( $i = 0 ; $i < 14000000; $i++ )
{
    $answer = !is_null($start1);
    $answer = !is_null($start0);    
}
$time_end = microtime(TRUE);
echo 'Did NOT IS NULL in ' . ($time_end - $time_start) . " seconds<br>";

在看到新版本PHP中可能出现的重大性能变化后,我对它的发展情况很感兴趣,因为竞争已经非常接近了

PHP的默认活动对您来说还不够吗

胡乱地从手册上撕下来 转换为布尔值

要将值显式转换为布尔值,请使用(bool)或(boolean)强制转换。但是,在大多数情况下不需要强制转换,因为如果运算符、函数或控件结构需要布尔参数,则会自动转换值

另见

转换为布尔值时,以下值被视为FALSE:

其他所有值均视为真(包括任何资源)


这似乎在以后的PHP版本中得到了优化:

Current PHP Version: 5.6.16-2+deb.sury.org~wily+1

Did NOT EMPTY in 0.43913006782532 seconds
Did TYPECAST BOOL in 0.40566301345825 seconds
Did EQUALS TRUE in 0.42750406265259 seconds
Did NOT NOT in 0.43936395645142 seconds
Did IS NULL in 1.3173689842224 seconds
PHP 7更令人印象深刻:

Current PHP Version: 7.0.1-1+deb.sury.org~wily+2

Did NOT EMPTY in 0.21985292434692 seconds
Did TYPECAST BOOL in 0.18928909301758 seconds
Did EQUALS TRUE in 0.17465591430664 seconds
Did NOT NOT in 0.20792722702026 seconds
Did IS NULL in 0.15517687797546 seconds

在这里,就性能和可读性而言,类型转换似乎是最佳解决方案(像
(bool)$someVar
这样的构造比
!!$someVar
或其他晦涩的构造更好地向其他开发人员传达您的意图).

首先,当您为
$start0
$start1
赋值时,您应该修复测试,但在未定义后者的情况下,请选中
$start1
$start2

一旦修复,最快的测试就是简单的比较(您没有尝试过):

$answer=$start0==1

这是我的代码(我从终端运行)

您可以在不同版本的PHP上运行测试


完全同意。PHP确实对真实性采取了“足够接近”的方法,因此确实不需要显式转换。对于客户端来说不够好,不。我与其他团队在面向对象的环境中工作,我的特定对象应该从数据库中提取,然后存储和传递数据,并将其作为true和false。所以是的,我的要求确实需要我上面列出的。此外,将其键入bool需要250%的时间!empty(),所以我不确定为什么我会选择在稍微考虑可读性的情况下这样做。在新版本的PHP或其他东西中是否更快?@riptor如果你想对这件事如此正式,这不一定是件坏事,为什么不使用ORM为你处理这件事呢?用低级数据库调用来捣乱会让你暴露出所有这些丑陋的东西。将
NULL
转换为
false
可能有一天会给你带来严重的麻烦。“未设置”与“设置为非真”完全不同。我同意,但客户和团队同意此映射。这是一个已有超过十年历史的系统,在这个系统中,用户库对数据输入很懒散,因此他们希望他们很少看到不正确的数据(
$start2
不是defined@Paolo,感谢您捕捉到这一点,这可能会改变一些事情。让我重新运行和编辑…哇,这些都是非常显著的改进和显著的差异!Not empty从包的前面一直到最后一个,反之亦然,对于IS NULL(虽然我意识到应该是!)(IS_NULL()现在我看到了)。感谢您提供的附加选项,我没有考虑到这一点!我修复了上面的测试并添加了您的选项,结果几乎相同。但是,我们都在运行5.4,所以我仍然想知道较新版本的PHP是否有不同的结果?作为警告,在PHP5.6.15中运行Paolo代码,并在56.041206121445秒当我从5.4.45中得到非常相似的数字时,如果你正在考虑升级,也许你应该检查一下这个哇,这个网站是一个伟大的发现!但是它在几乎所有服务器上中途退出了测试。。。
<?php
echo 'Current PHP Version: ' . phpversion() . "\n\n";
$start1 = 1;
$start0 = 0;

$time_start = microtime(TRUE);
for( $i = 0 ; $i < 8500000; $i++ )
{
    $answer = $start0 == 1;
    $answer = $start1 == 1;  
}
$time_end = microtime(TRUE);
echo 'Did COMPARISON in ' . ($time_end - $time_start) . " seconds\n";

$time_start = microtime(TRUE);
for( $i = 0 ; $i < 8500000; $i++ )
{
    $answer = !empty($start0);
    $answer = !empty($start1);  
}
$time_end = microtime(TRUE);
echo 'Did NOT EMPTY in ' . ($time_end - $time_start) . " seconds\n";

/* 
   .
   .
   .
*/
Current PHP Version: 5.4.45

Did COMPARISON in 0.60736107826233 seconds
Did NOT EMPTY in 0.75234413146973 seconds
Did TYPECAST BOOL in 0.67925190925598 seconds
Did EQUALS TRUE in 0.80053496360779 seconds
Did NOT NOT in 0.95479583740234 seconds
Did IS NULL in 2.1385459899902 seconds