2013-03-14 1 views
-6

다음 코드는 3 개의 수식을 계산하기 위해이 코드를 작성했습니다 : L c=Lcb-Lca where Lcb and Lca equals to 7915,7*Log10(Tan(X1/2+45))/G=Y2-Y1/V=G/Lc -> 올바른 형식으로 데이터를 넣을 수있는 중간 수식이 있습니다. 문제는 내가 치료할 데이터가 많이 있고 가능한 경우 내 코드를 최적화하는 방법을 찾고 싶다는 것입니다.어떻게 내 C++ 계산 속도를 높일 수 있습니까?

#include <cstdio> 
#include <iostream> 
#include <stdlib.h> 
#include <cmath> 
#include <fstream> 
#include <sstream> 
#include <string> 
#include "mysql/mysql.h" 

using namespace std; 


const string hostMySQL = "localhost"; 
const string userMySQL = "root"; 
const string database = "2_Generated_flights"; 
const string table = "8_airac_6_test"; 
const string passwordMySQL = "****"; 
const int port = 0; 
const int clientflag = 0; 

int main(int argc, char *argv[]){ 

    /* connection à MySQL */ 
    string request; 
    MYSQL * connection = mysql_init(NULL); 
    MYSQL_RES * result; 
    MYSQL_ROW row = NULL; 
      if(!mysql_real_connect(connection, hostMySQL.c_str(), userMySQL.c_str(), 
       passwordMySQL.c_str(), database.c_str(), 
       port, NULL, clientflag)){ 
    fprintf(stderr, "Connection to database failed: %s\n", 
     mysql_error(connection)); 
    return EXIT_FAILURE; 
    } 
    cout << "connected to mysql" << endl; 

    int sql_min_lat; 
    sql_min_lat=mysql_query(connection, "SELECT ind, Lat_begin_segment, Lon_begin_segment, Lat_end_segment, Lon_end_segment from 8_airac_6_test");/*on choisit les variables nécessaires*/ 
    if (sql_min_lat !=0) 
     { 
    cout <<mysql_error(connection); 
    return EXIT_FAILURE; 
     } 
    result=mysql_store_result(connection); 
    while((row = mysql_fetch_row(result))){ 
     /*calcul ind*/ 
     int ind, degrees_lat_begin, degrees_lat_end, degrees_lon_begin, degrees_lon_end, G_int; 
     float lat1, lat2, lon1, lon2, minutes_lat_begin, minutes_lat_end, minutes_lon_begin, minutes_lon_end, G_diff, G_pr; 
     double lat_beg_deg, lat_end_deg, lon_beg_deg, lon_end_deg, Lca, Lcb, Lc, G, TanV, V, Rv; 
     ind=atoi(row[0]); 
     /*calcul lat_begin en degree*/ 
     lat1=atof(row[1]);  
     degrees_lat_begin = int (lat1); 
     minutes_lat_begin = (lat1 - degrees_lat_begin) * 60; 
     minutes_lat_begin=(int)minutes_lat_begin; 
     if (minutes_lat_begin >-10 && minutes_lat_begin < 10) 
     { 
      minutes_lat_begin= minutes_lat_begin/10; 
      } 
      else { 
       minutes_lat_begin= minutes_lat_begin/100; 
       } 
     if (minutes_lat_begin ==1 || minutes_lat_begin==-1) { 
      minutes_lat_begin=minutes_lat_begin/100; 
     } 

     lat_beg_deg=degrees_lat_begin + minutes_lat_begin; 



     /*calcul lat_end en degree*/ 
     lat2=atof(row[3]); 
     degrees_lat_end = int (lat2); 
     minutes_lat_end = (lat2 - degrees_lat_end) * 60; 
     minutes_lat_end=(int)minutes_lat_end; 
     if (minutes_lat_end >-10 && minutes_lat_end < 10) 
     { 
      minutes_lat_end= minutes_lat_end/10; 
      } 
      else 
       { 
        minutes_lat_end=minutes_lat_end/100; 
        } 
     if (minutes_lat_end ==1 || minutes_lat_end==-1) { 
      minutes_lat_end=minutes_lat_end/100; 
     } 
     lat_end_deg=degrees_lat_end + minutes_lat_end; 

     cout << "Done degrees_lat_end!" << endl; 

     /*calcul lon_begin en degree*/ 
     lon1=atof(row[2]); 
     degrees_lon_begin = int (lon1); 
     minutes_lon_begin = (lon1 - degrees_lon_begin) * 60; 
     minutes_lon_begin=(int)minutes_lon_begin; 
     if (minutes_lon_begin >-10 && minutes_lon_begin < 10) { 
      minutes_lon_begin= minutes_lon_begin/10; 
      } 
      else 
      { 
       minutes_lon_begin= minutes_lon_begin/100; 
       } 

     if (minutes_lon_begin ==1 || minutes_lon_begin==-1) { 
      minutes_lon_begin=minutes_lon_begin/100; 
     } 
     lon_beg_deg=degrees_lon_begin + minutes_lon_begin; 



      /*calcul lon_begin en degree*/ 
     lon2=atof(row[4]);  
     degrees_lon_end = int (lon2); 
     minutes_lon_end = (lon2 - degrees_lon_end) * 60; 
     minutes_lon_end=(int)minutes_lon_end; 
     if (minutes_lon_end >-10 && minutes_lon_end < 10) { 
      minutes_lon_end= minutes_lon_end/10; 
      } 
      else 
      { 
       minutes_lon_end= minutes_lon_end/100; 
       } 

     if (minutes_lon_end ==1 || minutes_lon_end==-1) { 
      minutes_lon_end=minutes_lon_end/100; 
     } 
     lon_end_deg=degrees_lon_end + minutes_lon_end; 

     cout << "Done degrees_lon_end!" << endl; 

     /*LCA*/   
     Lca=tan(45+lat_beg_deg/2); 
     Lca=abs(Lca); 
     Lca=7915.7*log10(Lca); 
     Lca=abs(Lca); 

     /*LCB*/  
     Lcb=tan(45+lat_end_deg/2); 
     Lcb=abs(Lcb); 
     Lcb=7915.7*log10(Lcb); 
     Lcb=abs(Lcb); 


     /*LC*/  
     Lc=Lcb-Lca; 
     Lc=abs(Lc); 

     /*G*/  
     G_diff=lon_end_deg-lon_beg_deg; 
     G_diff=abs(G_diff); 
     G_int=int(G_diff);  
     G_pr=G_diff-G_int; 
     if (G_pr==1) { 
      G_pr=0; 
     } 
     G_pr=G_pr*100;  
     G=G_int*60+int(G_pr); 
     TanV=G/Lc;  
     V=atan(TanV)*57.2957795; 

     if (lat_end_deg>lat_beg_deg && lon_end_deg>lon_beg_deg) { 
      Rv=V;} 
      else if (lat_end_deg>lat_beg_deg && lon_end_deg<lon_beg_deg) { 
       Rv=360-V;} 
       else if (lat_end_deg<lat_beg_deg && lon_end_deg<lon_beg_deg) { 
        Rv=180+V;} 
        else { 
         Rv=180-V;} 

    char query[100000]; 
    sprintf(query, "INSERT INTO testRv(ind, Rv) VALUES(%i, %g)", ind, Rv); 
    mysql_query(connection, query); 
} 

     mysql_close(connection); 
     cout << "Done!" << endl; 
    } 
+3

1 단계 : 프로파일 러를 사용하여 시간이 어디인지 확인하십시오. – NPE

+1

응용 프로그램의 속도에 대해 걱정하기 전에 책을 집어 들고 좋은 코딩 방법 (RAII 사용 및 모든 것을 'main'에 넣지 않는 것과 같은)을 배우는 것이 좋습니다. – Grizzly

+4

음, 분명히 지리 좌표를 다루고있는 것은 분명하지만 코드를 통해 모든 것을 이해하도록하기보다는 내가하고있는 일의 요지를 설명하면 훨씬 도움이 될 것입니다. –

답변

2

코드를 최적화하려면 알고리즘을 분석하고 복잡성을 분석 한 후 알고리즘을 변경하십시오. 이 작업 뒤에는 마법이 없습니다. 알아 내기 위해 연구해야합니다.

또는 플랫폼에 따라 다른 전용 도구를 사용하여 코드를 프로파일 링하십시오. 프로파일 러는 프로그램의 모든 단계에서 소요 된 시간을 알려줍니다. 그런 다음 다른 접근 방식을 시도하고 시도 할 가치가있는 곳을 조사 할 수 있습니다.

귀하의 질문에 은색 총알이 없습니다. 조사하고 연구해야합니다.

+0

OP 형식이 멋지면 코드가 빨리 실행된다는 유혹을 피고 싶습니다. – gnasher729

관련 문제