簡體   English   中英

調用恆定復雜度O(1)5行函數會顯着影響性能,為什么呢?

[英]Calling constant complexity O(1) 5 line function significantly impacts performance, why?

我有以下代碼:

#include <ros.h>
#include <ros/time.h>
#include <sensor_msgs/Range.h>

#define sensNumber 3
#define firstTrigPin 3
#define firstEchoPin 9

ros::NodeHandle  nh;
sensor_msgs::Range range_msg;
ros::Publisher pub_range( "/ultrasound", &range_msg);
char frameid[] = "/ultrasound";

int trigPin=firstTrigPin;
int echoPin=firstEchoPin;

void increasepins(){
    trigPin++;
    echoPin++;
    if(trigPin>firstTrigPin+sensNumber){
        trigPin=firstTrigPin;
    }
    if(echoPin>firstEchoPin+sensNumber){
        echoPin=firstEchoPin;
    }
}

void setup(){
    nh.initNode();
    nh.advertise(pub_range);
    for(int i=0;i<sensNumber;i++){
        pinMode(trigPin, OUTPUT);
        pinMode(echoPin, INPUT);
        increasepins();  
    }
    range_msg.radiation_type = sensor_msgs::Range::ULTRASOUND;
    range_msg.header.frame_id =  frameid;
    range_msg.field_of_view = 0.1;  
    range_msg.min_range = 0.0;
    range_msg.max_range = 6.47;
}

long range_time;

void loop()
{
    increasepins();
    //publish the adc value every 50 milliseconds
    //since it takes that long for the sensor to stablize
    long duration, distance;
    digitalWrite(trigPin, LOW);  // should be high?
    delayMicroseconds(2); // make this 20
    digitalWrite(trigPin, HIGH);
    delayMicroseconds(10); // reset value?
    digitalWrite(trigPin, LOW);
    distance = pulseIn(echoPin, HIGH)/ 58,2; //sensor constant is 3.4

    range_msg.range = distance;
    range_msg.header.stamp = nh.now();
    range_time =  millis() + 50;
    range_msg.field_of_view = trigPin; 
    range_msg.min_range = echoPin;

    pub_range.publish(&range_msg);

    nh.spinOnce();
}

上面的代碼在我的Funduino上以大約每秒2次的速度在整個循環中運行。 但是,如果我刪除了increasePins方法,它將以每秒約100次的速度運行。 為什么機會很大? 看起來如此微不足道的代碼片段(只需增加2個變量,然后進行比較即可)產生如此大的不同?

作為參考,我們正在討論此功能:

void increasepins(){
    trigPin++;
    echoPin++;
    if(trigPin>firstTrigPin+sensNumber){
        trigPin=firstTrigPin;
    }
    if(echoPin>firstEchoPin+sensNumber){
        echoPin=firstEchoPin;
    }
}

與必須等待回波返回並獲得時間以及其余代碼所需的東西相比,對我來說,這看起來非常簡單。

我認為問題之一是,如果您在循環中注釋了gainPins函數,則編譯器將決定在循環外采用一些邏輯。 為此,您需要查看@匯編代碼,並查看循環中正在執行的操作。

另一個問題可能與引腳行為有關。 例如,我讀到“ pulseIn ”功能向該引腳發送脈沖並測量其持續時間。 您可以用它來脈沖“ echoPin”。 我懷疑如果您不更改echoPin,則持續時間會相當恆定。 但是,更改echoPin可能會導致另一引腳的脈沖持續時間更長的情況。 為了驗證這一點,你可以嘗試使用pulsePin(echoPin, HIGH, timeout)用的情況下的超時參數,當你沒有發表評論的increasePins功能。 我希望循環運行得更快。

所以,我認為increasePins不是瓶頸。 我建議將其內聯 (如果編譯器尚未這樣做,則可以提高速度)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM