在for循环中为数组长度声明变量

时间:2015-04-28 10:34:55

标签: java for-loop

我最近一直在审核代码,注意到在for循环中使用了这种语法

You have two option to find job by location 

you required 
1. Search users lat long
2. Job users Posted Lat long (it may be job location or job posted user location from database)
3. Query will be like - 
SELECT zip,Round(((ACOS(SIN('$lat' * PI() / 180) * SIN(latitude * PI() / 180) + COS('$lat' * PI() / 180) * COS(latitude * PI() / 180) * COS(('$lon'-longitude) * PI() / 180)) * 180 / PI()) * 60 * 1.1515),(2)) AS distance FROM Jobs Having distance <= 30 

Else 
1. You have to call all jobs data in single query.

     foreach($joblist as $job){
        $milesresult = $this->calculateDistance($user_lat,$user_lon,$job['latitude'],$jobr['longitude']);
        $miles = explode("-",$vendor['miles']);
         $vendor_max_miles = $miles[1];
        }

2. PHP function for lat long

      function calculateDistance($lat1, $lon1, $lat2, $lon2, $unit) {

            $theta = $lon1 - $lon2;

            $dist = sin(deg2rad($lat1)) * sin(deg2rad($lat2)) + cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * cos(deg2rad($theta));

            $dist = acos($dist);

             $dist = rad2deg($dist);

              $miles = $dist * 60 * 1.1515;
            $unit = strtoupper($unit);

            if ($unit == "K") {
              return ($miles * 1.609344);
            } else if ($unit == "N") {
                return ($miles * 0.8684);
              } else {
                  return $miles;
                }
        }

而不是:

for(int i = 0, len = myArray.length; i < len; i++){
    //some code
}

理由是它更有效率,因为你不必每次循环都要继续查找myArray.length属性。

我创建了一个测试来检查是否是这种情况,并且在我的所有测试中,第一个for循环方法显着(大约70%)比第二个快。

我很好奇为什么这种语法不被广泛采用,而且我认为这是一种更好的方法,可以通过数组使用for循环。

3 个答案:

答案 0 :(得分:5)

这是一种缓存优化,正如您所指出的那样,会阻止许多length的读取。通常,没有必要执行这种微优化,这可以解释为什么大多数工程师都乐意在每次循环后检查length而不是缓存它,但它在高性能代码中很有用。它也可以这样写,反转循环的方向,避免使用另一个变量来保持数组的长度:

for (int i = myArray.length - 1; i >= 0; i--) {
    // some code
}

答案 1 :(得分:0)

第一种方法只评估一次长度,而不是每次循环评估长度的第二种方法。

答案 2 :(得分:0)

在我看来,大多数Java程序员都会在数组的情况下使用for-each循环,除非我们想用索引值进行一些操作