缺页引发的性能下降测试

缺页是什么?

当CPU请求一个不在RAM中的内存页时, 会发生缺页。

发生缺页时会进行页面置换,这个过程比较慢。

在比较大的循环中, 每次按列操作, 如果一行的数据太多,

就有可能引发缺页, 导致性能下降。

测试代码

代码来自代码大全(code complete):

function test_page($max_columns, $max_rows) {
    $table = array();
    for ($column = 0; $column < $max_columns; $column++) {
        for ($row = 0; $row < $max_rows; $row++) {
            $table[$row][$column] = 0;
        }
    }
}

function test_page_row($max_columns, $max_rows) {
    $table = array();
    for ($row = 0; $row < $max_rows; $row++) {
        for ($column = 0; $column < $max_columns; $column++) {
            $table[$row][$column] = 0;
        }
    }
}

$max_columns = 10000;
$max_rows = 200;

//test_page($max_columns, $max_rows);
test_page_row($max_columns, $max_rows);

测试结果

test_page()测试结果:

real    0m4.343s
user    0m3.817s[......]

Read more

php准确校验邮箱地址是否存在

背景

PHP校验邮箱地址的方法很多, 比较常用的就是自己写正则了, 不过正则多麻烦, 我PHP自带了方法做校验。

filter_var

filter_var是PHP内置的一个变量过滤的方法, 提供了很多实用的过滤器, 可以用来校验整数、浮点数、邮箱、URL、MAC地址等。

具体的过滤器参考: filters.validate

filter_var如果返回false, 说明变量无法通过过滤器, 也就是不合法了。

$email = "lastchiliarch@163.com";

var_dump(filter_var($email,  FILTER_VALIDATE_EMAIL))[......]

Read more

nginx+lua+redis实现反向代理

背景

最近要进行IVR的重构, 我们现在系统接了三家IVR服务商, N个业务, 由于IVR这玩意一般只能外网回调, 而开发环境又不允许外网随便访问,

着实烦人。 所有我们打算重构一把, 封装多家IVR, 对业务透明, 同时回调可以针对多家IVR服务商的不同callid直接转发到当时请求的同学的

开发域名去。

而不同的IVR服务商的callid参数是不同的,有的是在url里面(call_id), 有的则是直接post的json数据(callid), 所以太扯了。

直接用lua处理下, 查下redis里面这个callid当时是哪位同学发起的请求(请求IVR的时候会写入redis中), 直[……]

Read more

codility之Brackets

Brackets

题目链接:

Brackets

题目解析

其实就是平衡符号。

如何解决?

利用栈就可以搞定, 具体不明白的看书吧。

talk is cheap, show me the code~

代码:



function solution($S) {
    // write your code in PHP5.5
    $open_symb  = array( '{', '[', '(' );
    $close_symb = array( '}', ']', ')' );
    $check = array();
    for($i = 0; $i< strlen($S); $i++) {
        $v = $S[$i];
        if (in_array($v, array_values($open_symb))) {
            array_push($check, $v);
        } elseif (in_array($v, array_values($close_symb))) {
            $symbol = array_pop($check);
            $cor_symbol = array_search($v, $close_symb);
            if ($symbol !== $open_symb[$cor_symbol]) {
                return  0;
            }
        }
    }
    
    if (!empty($check)) {
        return 0;
    }
  

[……]

Read more

codility之Distinct

Distinct

题目链接:

Distinct

题目解析

比较简单, 就是求数组A中的不重复的数字。

如何解决?

直接来一次遍历就可以搞定了。

talk is cheap, show me the code~

代码:

function solution($A) {
    // write your code in PHP5.5
    $statis = array();
    foreach ($A as $k => $v) {
        if (!isset($statis[$v])) {
            $statis[$v] = 1;[......]

Read more

codility之MaxProductOfThree

MaxProductOfThree

题目链接:

MaxProductOfThree

题目解析

比较简单, 就是求一个数组A中的三个数的乘积最大值。

如何解决?

按照题目的时间复杂度, 直接来一次排序就可以搞定了。

talk is cheap, show me the code~

代码:


function solution($A) {
    // write your code in PHP5.5
    rsort($A);
    $max = $A[0] * $A[1] * $A[2];
    $max = max($max, $A[0] * $A[count($[......]

Read more

codility之GenomicRangeQuery

GenomicRangeQuery

题目链接:

GenomicRangeQuery

题目解析

大致就是说给定一个S, 然后有一个P, 一个Q, 遍历P(或者Q), 求S在P[i]-Q[i]区间内的最小值(A,C,G,T对应的factor).

如何解决?

问题所在

最简单的直接来整, 但很悲剧在P[i]-Q[i]区间过大的情况下会时间复杂度不够, 囧。

仔细想了下, 其实这个问题就是等价于如何在给定的S情况下, 如果求特定区间的最小值的问题。

举个栗子, S=’CAGCCTA’, 求S[2]-S[4]的最小值。 这个操作本身就是O(n)的, 所以在题目已经

限定的双重循环的情[……]

Read more

codility之PassingCars

PassingCars

题目:


A non-empty zero-indexed array A consisting of N integers is given. The consecutive elements of 

array A represent consecutive cars on a road.

Array A contains only 0s and/or 1s:

        0 represents a car traveling east,
        1 represents a car traveling west.

The goal is[......]

Read more

codility之CountDiv

CountDiv

题目:



Write a function:

    function solution($A, $B, $K);

that, given three integers A, B and K, returns the number of integers within the range [A..B] that are divisible by K, i.e.:

    { i : A ≤ i ≤ B, i mod K = 0 }

For example, for A = 6, B = 11 and K = 2, your function should re[......]

Read more

codility之MaxCounters

MissingInteger

题目:


You are given N counters, initially set to 0, and you have two possible operations on them:

        increase(X) − counter X is increased by 1,
        max counter − all counters are set to the maximum value of any counter.

A non-empty zero-indexed array A of M integers is gi[......]

Read more