zoukankan      html  css  js  c++  java
  • 使用static来避免“重复读”

    在较复杂的web程序开发中,由于采用面向对象的数据操作方式,或者业务逻辑太过复杂,开发人员在开发过程中,经常会无意识的重复读取数据。
    比如:
    $result1 = tableobjectPeer::getResult($var1,$var2,$var3);
    开发人员在需要的该table数据的时候,经常直接调用 tableobjectPeer::getResult方法。
    又或者程序在进行forward()的时候,也会导致重复调用  tableobjectPeer::getResult 方法,导致“重复读”。

    要避免类似的“重复读”,最主要的办法是,开发人员在代码开发的时候,就要有“避免重复读”的意识。
    其实只要在:
    $result1 = tableobjectPeer::getResult($var1,$var2,$var3);
    之后,需要的地方进行
    $result2 = $result1;
    $result3 = $result1;
    即可。这样子就可以避免掉大量的“重复读”了。
    但是如果开放人员一开始没有这样做,那要进行这方面的重构可能是很大的工作量。
    另外,由于框架中的forward()也容易造成“重复读”。如果“重复读”是forward()造成的,那该方法就不可行了(这点也许和不同的开发语言,不同的开发框架有关,在php的symfony框架中是如此)。

    因此,在采用上面的方法进行优化的同时,对于一些较复杂的情况,决定采用另一种方式:使用static,设置变量为静态变量,来避免重复读取数据

    示例代码如下:
    Code
    运行上述代码,产生的结果类似:
    16667
    8888
    16667
    8888
    2193
    1014
    可以看出,第1行和第3行的结果一致,第2行和第4行的结果一致,说明只要函数的参数相同,函数结果就进行了有效的“cache”。
    从第4行和第5行,可以看出,通过设置$is_static变量能有效控制是否开启“cache”。

    补充:上述使用static方法,可以有效的避免在一个线程内,重复读取数据,但是该cache只存在一个线程内,不同线程是相互独立的。虽然只是线程内的函数结果“cache”,但是其原理和其他方式的cache是类似的,就是要针对不同的参数(不同的情况)构造出cache的key。
  • 相关阅读:
    bzoj3306: 树(dfs序+倍增+线段树)
    bzoj1969: [Ahoi2005]LANE 航线规划(树链剖分)
    Codeforces 578B. "Or" Game(思维题)
    bzoj3251: 树上三角形(思维题)
    bzoj2006: [NOI2010]超级钢琴(堆+RMQ)
    bzoj4165: 矩阵(堆+hash)
    bzoj3007: 拯救小云公主(二分+并查集)
    Codeforces 582C. Superior Periodic Subarrays(数学+计数)
    Codeforces 585E. Present for Vitalik the Philatelist(容斥)
    Codeforces 585D. Lizard Era: Beginning(meet in the middle)
  • 原文地址:https://www.cnblogs.com/rethink/p/1570981.html
Copyright © 2011-2022 走看看