如何準確測量 Android 應用中 Activity 和 Fragment 的啟動時間

如何準確測量 Android 應用中 Activity 和 Fragment 的啟動時間

在 Android 應用開發中,了解每個 Activity 和 Fragment 的啟動時間對于性能優化至關重要。本文將介紹幾種方法來準確測量 Activity 和 Fragment 的啟動時間,并提供實際操作步驟,以幫助提升應用的響應速度和用戶體驗。


1. 使用 adb shell am start -W 命令

adb shell am start -W 命令是一種簡單且直接的方法,用于測量 Activity 的啟動時間。該命令啟動指定的 Activity 并輸出相關的時間數據。以下是如何使用該命令,以及如何解決常見錯誤。

1.1 命令

adb shell am start -W -n <your.package.name>/<your.package.name.yourActivity>

1.2 輸出解釋

  • ThisTime: 當前 Activity 的啟動時間。
  • TotalTime: 從應用啟動到當前 Activity 的總時間。
  • WaitTime: 系統等待時間。

1.3 啟動 Activity 并傳遞參數

使用 -e 選項傳遞參數

要傳遞鍵值對參數,可以使用 -e 選項。-e 選項用于將一個字符串鍵值對傳遞給目標 Activity。如果有多個鍵值對需要傳遞,可以使用多個 -e 選項。

命令格式
adb shell am start -n <your.package.name>/<your.package.name.YourActivity> -e <key1> <value1> -e <key2> <value2> ...
  • -n <your.package.name>/<your.package.name.YourActivity>:指定要啟動的 Activity
  • -e <key> <value>:指定要傳遞的參數及其對應的值。key 是參數的名稱,value 是參數的值。
示例

應用程序包名為 com.example.app,要啟動的 Activitycom.example.app.ui.MainActivity,并且需要傳遞兩個參數:user_idsession_token。可以使用以下命令:

adb shell am start -n com.example.app/com.example.app.ui.MainActivity -e user_id 12345 -e session_token abcdef123456
傳遞多種數據類型

除了使用 -e 選項傳遞字符串參數,還可以使用以下選項傳遞其他數據類型的參數:

  • -e:傳遞字符串鍵值對。
  • -en:傳遞整數鍵值對。
  • -ef:傳遞浮點數鍵值對。
  • -el:傳遞長整型鍵值對。
  • -eb:傳遞布爾鍵值對。
  • -eia:傳遞整數數組鍵值對。
  • -efa:傳遞浮點數數組鍵值對。
示例

如果需要傳遞一個整數和一個布爾值參數,可以使用以下命令:

adb shell am start -n com.example.app/com.example.app.ui.MainActivity -en max_retries 5 -eb is_active true

在這個例子中,max_retries 是一個整數參數,is_active 是一個布爾參數。

解析傳遞的參數

在的 Activity 中,可以通過 Intent 對象來獲取傳遞的參數。例如:

public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Intent intent = getIntent();String userId = intent.getStringExtra("user_id");String sessionToken = intent.getStringExtra("session_token");// 使用獲取的參數}
}

對于其他數據類型的參數,可以使用對應的 Intent 方法進行獲取,例如 getIntExtragetBooleanExtra 等。


通過使用 -e 及相關選項,可以方便地將參數傳遞給 Activity,在測試和調試過程中模擬各種條件。這使得驗證應用程序的不同功能變得更加高效和靈活。

1.4 常見錯誤及解決方案

1.4.1 java.lang.SecurityException: Permission Denial

錯誤信息:

java.lang.SecurityException: Permission Denial: starting Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=com.example.myapp/.MainActivity mCallingUid=2000 } from null (pid=29129, uid=2000) not exported from uid 10600

原因: 當嘗試啟動的 Activity 沒有配置為導出的或沒有適當的權限時,會出現此錯誤。

解決方案:

  1. 修改 AndroidManifest.xml: 確保目標 Activity 已配置為 exported="true",這樣才能允許外部調用。

    <activityandroid:name=".MainActivity"android:exported="true"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter>
    </activity>
    
  2. 檢查權限: 確保應用具有適當的權限,或嘗試使用 adb 命令以 root 權限運行。

1.4.2 java.lang.SecurityException: Permission Denial: starting Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=com.example.myapp/.MainActivity } from null (pid=29219, uid=2000) not exported from uid 10600

錯誤信息:

java.lang.SecurityException: Permission Denial: starting Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=com.example.myapp/.MainActivity mCallingUid=2000 } from null (pid=29219, uid=2000) not exported from uid 10600

原因: 該錯誤通常表示目標 Activity 沒有正確配置為導出或啟動。即使 Activity 是導出的,它可能沒有正確設置 intent-filterlaunchMode

解決方案:

  1. 配置 intent-filter: 確保 Activity 正確配置了 intent-filter,如果需要,它應包括 MAINLAUNCHER 動作和類別。

    <activityandroid:name=".MainActivity"android:exported="true"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter>
    </activity>
    
  2. 檢查啟動模式: 如果 Activity 是內部活動或不需要被外部啟動,考慮使用其他方法測試,或者設置 android:exported="true" 確保外部調用。

1.4.3 ActivityNotFoundException

錯誤信息:

android.content.ActivityNotFoundException: Unable to find explicit activity class {com.example.myapp/.MainActivity}; have you declared this activity in your AndroidManifest.xml?

原因: 該錯誤表示系統無法找到指定的 Activity。這可能是因為在 AndroidManifest.xml 中沒有正確聲明該 Activity,或包名和類名錯誤。

解決方案:

  1. 檢查 AndroidManifest.xml: 確保目標 Activity 已在 AndroidManifest.xml 中正確聲明。

    <activityandroid:name=".MainActivity"android:exported="true"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter>
    </activity>
    
  2. 核對包名和類名: 確保 adb 命令中的包名和類名與實際聲明的一致。


2. 手動記錄啟動時間

為了獲得更準確的數據,可以在代碼中手動記錄每個 Activity 的啟動時間。這種方法能夠提供更符合實際使用場景的數據。

2.1 代碼

在每個 Activity 的 onCreate 方法中記錄啟動時間:

public class MainActivity extends AppCompatActivity {private static final String TAG = "MainActivity";@Overrideprotected void onCreate(Bundle savedInstanceState) {long startTime = System.currentTimeMillis();super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);long elapsedTime = System.currentTimeMillis() - startTime;Log.d(TAG, "Activity startup time: " + elapsedTime + " ms");}
}

2.2 捕獲日志

使用 adb logcat 捕獲啟動時間日志:

adb logcat -s MainActivity

3. 使用 Application.ActivityLifecycleCallbacks 接口記錄activity啟動時長

為了自動記錄每個 Activity 的啟動時間,避免在每個 Activity 中重復編寫代碼,可以使用 Application.ActivityLifecycleCallbacks 接口。

3.1使用注解標記中文名

首先,我們創建一個自定義注解來標記 Activity 的中文名。

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;@Retention(RetentionPolicy.RUNTIME)
public @interface ChineseName {String value();
}

然后,在每個 Activity 類上使用這個注解。

import android.app.Activity;
import android.os.Bundle;@ChineseName("我的Activity中文名")
public class MyActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// Activity 其他代碼...}
}

3.2創建生命周期回調類

實現 Application.ActivityLifecycleCallbacks

創建一個實現 Application.ActivityLifecycleCallbacks 接口的類,以記錄每個 Activity 的啟動時間,并使用反射獲取中文名。

import android.app.Activity;
import android.app.Application;
import android.os.Bundle;
import android.util.Log;public class ActivityLifecycleHandler implements Application.ActivityLifecycleCallbacks {private static final String TAG = "ActivityLifecycleHandler";@Overridepublic void onActivityCreated(Activity activity, Bundle savedInstanceState) {long startTime = System.currentTimeMillis();activity.getWindow().getDecorView().post(() -> {long endTime = System.currentTimeMillis();long duration = endTime - startTime;String activityName = getChineseName(activity);Log.d(TAG, activityName + " creation time: " + duration + " ms");});}@Overridepublic void onActivityStarted(Activity activity) {}@Overridepublic void onActivityResumed(Activity activity) {}@Overridepublic void onActivityPaused(Activity activity) {}@Overridepublic void onActivityStopped(Activity activity) {}@Overridepublic void onActivitySaveInstanceState(Activity activity, Bundle outState) {}@Overridepublic void onActivityDestroyed(Activity activity) {}private String getChineseName(Activity activity) {ChineseName annotation = activity.getClass().getAnnotation(ChineseName.class);if (annotation != null) {return annotation.value();} else {return activity.getClass().getSimpleName();}}
}

3.3 注冊生命周期回調

Application 類中注冊生命周期回調:

public class MyApp extends Application {@Overridepublic void onCreate() {super.onCreate();registerActivityLifecycleCallbacks(new AppLifecycleHandler());}
}

3.4 修改 AndroidManifest.xml

確保在 AndroidManifest.xml 中指定自定義的 Application 類:

<applicationandroid:name=".MyApp"...>...
</application>

3.5持續日志輸出

使用 adb logcat 命令捕獲啟動時間的日志輸出。

adb logcat -s AppLifecycleHandler

每次切換頁面或啟動新的 Activity 時,控制臺會輸出類似如下的日志信息:

07-04 14:23:45.123 1234-1234/com.example.myapp D/AppLifecycleHandler: MainActivity startup time: 150 ms
07-04 14:23:47.567 1234-1234/com.example.myapp D/AppLifecycleHandler: SettingsActivity startup time: 180 ms
07-04 14:23:47.567 1234-1234/com.example.myapp D/AppLifecycleHandler: 我的Activity中文名 startup time: 180 ms

這些日志顯示了每個 Activity 的啟動時間。通過這些數據,可以分析和優化應用性能。

4.記錄所有 Fragment 啟動時間

同樣,可以通過覆蓋 Fragment 的生命周期方法來記錄 Fragment 的啟動時間。

4.1使用注解標記中文名

同樣地,為 Fragment 使用相同的 ChineseName 注解。

import androidx.fragment.app.Fragment;@ChineseName("我的Fragment中文名")
public class MyFragment extends Fragment {// Fragment 代碼...
}

4.2覆蓋 Fragment 生命周期方法

首先,創建一個基類 BaseFragment,覆蓋 FragmentonCreateView 方法,以記錄每個 Fragment 的啟動時間。

import android.os.Bundle;
import android.util.Log;
import android.view.View;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;public class FragmentLifecycleHandler extends FragmentManager.FragmentLifecycleCallbacks {private static final String TAG = "FragmentLifecycleHandler";@Overridepublic void onFragmentViewCreated(@NonNull FragmentManager fm, @NonNull Fragment f, @NonNull View v, @Nullable Bundle savedInstanceState) {long startTime = System.currentTimeMillis();f.getView().post(() -> {long endTime = System.currentTimeMillis();long duration = endTime - startTime;String fragmentName = getChineseName(f);Log.d(TAG, fragmentName + " view creation time: " + duration + " ms");});}private String getChineseName(Fragment fragment) {ChineseName annotation = fragment.getClass().getAnnotation(ChineseName.class);if (annotation != null) {return annotation.value();} else {return fragment.getClass().getSimpleName();}}
}

4.3完整代碼示例

所有的 Fragment 類繼承自 BaseFragment

public class MyFragment extends BaseFragment {@Nullable@Overridepublic View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {return inflater.inflate(R.layout.fragment_my, container, false);}
}

4.4持續日志輸出

使用 adb logcat 命令捕獲啟動時間的日志輸出。

adb logcat -s FragmentLifecycle

每次加載 Fragment 時,控制臺會輸出類似如下的日志信息:

07-04 14:23:45.123 1234-1234/com.example.myapp D/FragmentLifecycle: MyFragment startup time: 120 ms

這些日志顯示了每個 Fragment 的啟動時間。通過這些數據,可以分析和優化應用性能。

5. 使用第三方工具

除了自定義實現外,還有許多第三方工具和庫可以幫助測量和優化應用的啟動時間。以下是一些常用的工具和庫:

5.1 阿里云移動監控(Aliyun Mobile Monitoring)

阿里云移動監控 提供了全面的性能監控解決方案,包括啟動時間、崩潰分析、用戶行為分析等功能。

使用步驟:
  1. 集成 SDK
    • 在阿里云控制臺創建一個項目,并下載阿里云移動監控 SDK。
    • 將 SDK 集成到的 Android 應用中。具體步驟可以參考 阿里云官方文檔。
  2. 配置性能監控
    • 在阿里云控制臺中配置性能監控,包括啟動時間監控和用戶行為分析。
  3. 查看性能數據
    • 登錄阿里云控制臺,訪問 阿里云移動監控 部分,可以查看應用的啟動時間、崩潰報告以及用戶行為分析數據。

5.2 騰訊云移動分析(Tencent Cloud Mobile Analytics)

騰訊云移動分析 提供了全面的應用性能監控和用戶行為分析功能,適用于中國國內的應用開發者。

使用步驟:
  1. 集成 SDK
    • 在騰訊云控制臺創建一個項目,并下載騰訊云移動分析 SDK。
    • 將 SDK 集成到的 Android 應用中。具體步驟可以參考 騰訊云官方文檔.
  2. 配置性能監控
    • 在騰訊云控制臺中配置性能監控和用戶行為分析功能。
  3. 查看性能數據
    • 登錄騰訊云控制臺,訪問 騰訊云移動分析 部分,可以查看應用的啟動時間、崩潰報告以及用戶行為數據。

5.3 百度移動統計(Baidu Mobile Statistics)

百度移動統計 提供了應用性能監控和用戶行為分析功能,幫助開發者了解應用的性能和用戶行為。

使用步驟:
  1. 集成 SDK
    • 在百度統計控制臺創建一個項目,并下載百度移動統計 SDK。
    • 將 SDK 集成到的 Android 應用中。具體步驟可以參考 百度統計官方文檔.
  2. 配置性能監控
    • 在百度統計控制臺中配置性能監控功能和用戶行為分析。
  3. 查看性能數據
    • 登錄百度統計控制臺,訪問 百度移動統計 部分,可以查看應用的啟動時間、崩潰報告和用戶行為數據。

5.3 Android Profiler

Android Profiler 是 Android Studio 提供的一套工具,可以幫助實時監控應用的性能,包括啟動時間、內存使用、CPU 使用等。

使用步驟:
  1. 啟動 Android Studio Profiler

    • 打開 Android Studio,運行的應用。
    • 選擇 View > Tool Windows > Profiler,然后選擇的應用進程。
  2. 監控應用啟動時間

    • 在 Profiler 窗口中,選擇 CPU 視圖。
    • 啟動應用時,Profiler 會記錄啟動過程中 CPU 的使用情況,可以幫助了解啟動時間及其瓶頸。
  3. 分析性能數據

    • Profiler 提供的時間線視圖和詳細的性能指標可以幫助識別啟動過程中的性能問題。
    • 可以查看應用的活動生命周期、內存使用情況以及 CPU 占用情況,從而找到優化的切入點。

5.4 LeakCanary

LeakCanary 是一個開源的內存泄漏檢測庫,可以幫助檢測和修復內存泄漏,從而間接優化應用的啟動時間和整體性能。

使用步驟:
  1. 集成 LeakCanary

    • build.gradle 文件中添加 LeakCanary 的依賴:

      debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.10'
      
  2. 自動檢測內存泄漏

    • LeakCanary 會自動監控應用的內存泄漏并在發現泄漏時發出警告。
  3. 修復內存泄漏

    • 根據 LeakCanary 提供的報告,識別并修復內存泄漏問題,從而提高應用的性能和啟動速度。

備注

Firebase Performance Monitoring

Firebase Performance Monitoring 是一個由 Google 提供的性能監控工具,它可以幫助開發者監控應用的性能,包括啟動時間、網絡請求時間等。然而,由于某些 Google 服務在中國大陸可能會受到訪問限制,Firebase Performance Monitoring 的功能和數據傳輸可能會受到影響。

官方地址:

  • Firebase Performance Monitoring 官方文檔

總結

使用這些第三方工具,可以更全面地監控和優化應用的啟動時間和整體性能。三方庫 和 Android Profiler 提供了實時的性能數據和分析功能,而 LeakCanary 可以幫助發現并修復內存泄漏問題。這些工具和庫的結合使用,可以幫助提升應用的用戶體驗和性能。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/39307.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/39307.shtml
英文地址,請注明出處:http://en.pswp.cn/web/39307.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Spark SQL----內置函數JSON Functions

Spark SQL----內置函數JSON Functions JSON Functions 例子&#xff1a; -- from_json SELECT from_json({"a":1, "b":0.8}, a INT, b DOUBLE); --------------------------- |from_json({"a":1, "b":0.8})| -----------------------…

c++之auto

auto auto與for結合begin(),end()說明 auto c11標準引入auto類型說明符必須有初始值通過初始值來推斷變量的類型 #include<cstdio> using namespace std; int main(){int v1 10;auto v2 v1;printf("v2%d\n",v2);double v310.5;auto v4 v3;printf("v4…

SF-HCI-SAP問題收集17:值映射布爾型EC數據

Complacency is the enemy of study 學習的敵人是自己的滿足。 SAP SuccessFactors Employee Central 到 SAP ERP 的員工主數據復制 successfactor employee center主數據同步&#xff0c;一直以來排錯比較難&#xff0c;難的地方是這個提示消息比較隱晦&#xff0c;而且同步的…

數據結構與算法學習(1)

#學習自用# 算法性能分析 時間復雜度O() 時間復雜度就是算法計算的次數。 for(int i0;i<n;i) {ans; } ans; 這串代碼時間復雜度為O(n)&#xff0c;實際時間復雜度為O(n1)。如果把i改為i2&#xff0c;時間復雜度仍然為為O(n)&#xff0c;實際時間復雜度變為O(n/2 1)。時…

云原生技術架構詳解

云原生技術最全詳解(圖文全面總結) 容器技術 容器技術&#xff1a;是將應用程序、及其所有依賴項&#xff0c;打包到一個獨立的、可移植的容器中。 如下圖所示: 容器技術的實現&#xff0c;最典型的就是以Docker為代表的。 如下圖所示&#xff1a; 主要解決&#xff1a; 1、…

AI常見名詞盤點(持續更新)

目錄 知識庫 知識庫的定義 知識庫的分類 AI知識庫的特點 小結 Embedding 向量化表示 維度降低 語義關系 小結 提示詞工程&#xff08;Prompt Engineering&#xff09; 定義 目的與應用 關鍵性質 工程化思想 應用示例 小結 RAG 檢索增強生成 定義與重要性 RA…

Ubuntu設置nacos開機以單機模式自啟動

首先&#xff0c;需要安裝jdk Ubuntu 安裝JDK 創建Systemd服務單元文件 sudo vim /etc/systemd/system/nacos.service按i進入編輯模式&#xff0c;寫入下面信息 [Unit] Descriptionnacos server Afternetwork.target[Service] Typeforking Environment"JAVA_HOME/opt/j…

Java8 - Optional 處理可能為空值的容器類

1. 創建一個 Optional 對象 Optional.of、Optional.ofNullable 、Optional.empty是Optional類的三個靜態方法&#xff0c;用于創建Optional對象。 1. Optional.of 方法 Optional.of 方法用于創建一個包含非空值的Optional對象&#xff0c;如果傳入的值為null&#xff0c;則會…

Kafka集群安裝部署

簡介 Kafka是一款分布式的、去中心化的、高吞吐低延遲、訂閱模式的消息隊列系統。 同RabbitMQ一樣&#xff0c;Kafka也是消息隊列。不過RabbitMQ多用于后端系統&#xff0c;因其更加專注于消息的延遲和容錯。 Kafka多用于大數據體系&#xff0c;因其更加專注于數據的吞吐能力…

用freertos后NVIC里系統時鐘部分報錯,如何解決?

&#x1f3c6;本文收錄于《CSDN問答解答》專欄&#xff0c;主要記錄項目實戰過程中的Bug之前因后果及提供真實有效的解決方案&#xff0c;希望能夠助你一臂之力&#xff0c;幫你早日登頂實現財富自由&#x1f680;&#xff1b;同時&#xff0c;歡迎大家關注&&收藏&…

百日筑基第十天-重溫Spring

百日筑基第十天-重溫Spring Spring AOP 也就是 Aspect-oriented Programming&#xff0c;譯為面向切面編程&#xff0c;是計算機科學中的一個設計思想&#xff0c;旨在通過切面技術為業務主體增加額外的通知&#xff08;Advice&#xff09;&#xff0c;從而對聲明為**“切點”…

YOLOv8模型調參---數據增強

目錄 1.數據預處理 2.數據增強 2.1 數據增強的作用 2.2 數據增強方式與適用場景 2.2.1離線增強&#xff08;Offline Augmentation&#xff09; 2.2.2 在線增強&#xff08;Online Augmentation&#xff09; 3. 數據增強的具體方法 4. YOLOv8的數據增強 4.1 YOLOv8默認…

Http 實現請求body體和響應body體的雙向壓縮方案

目錄 一、前言 二、方案一(和http header不進行關聯) 二、方案二(和http header進行關聯) 三、 客戶端支持Accept-Encoding壓縮方式,服務器就一定會進行壓縮嗎? 四、參考 一、前言 有時請求和響應的body體比較大,需要進行壓縮,以減少傳輸的帶寬。 二、方案一(和…

《信息記錄材料》是什么級別的期刊?是正規期刊嗎?能評職稱嗎?

?問題解答 問&#xff1a;《信息記錄材料》是不是核心期刊&#xff1f; 答&#xff1a;不是&#xff0c;是知網收錄的第一批認定學術期刊。 問&#xff1a;《信息記錄材料》級別&#xff1f; 答&#xff1a;國家級。主管單位&#xff1a;全國磁性記錄材料信息站 主辦單位…

Oracle PL / SQL 函數

FUNCTION是返回值的PL / SQL塊或方法&#xff0c;因此它可以在賦值的右側使用。這里是一個例子&#xff1a; n_value : to_number(123.45); 由于FUNCTION返回一個值&#xff0c;因此也可以在SQL語句中使用它&#xff0c;如下例所示&#xff1a; select to_number(1) from dual;…

社區活動|FlowUs知識庫的發展|先進技術的落地應用|下一代生產力工具你用了嗎

在當今快速發展的數字化時代&#xff0c;技術的進步不斷推動著工作方式和知識管理的革新。FlowUs&#xff0c;作為一款前沿的知識管理和協作平臺&#xff0c;正站在這一變革的浪潮之巔&#xff0c;引領著智能工作的新潮流。 智能化的智能學習引導工具 FlowUs不僅僅是一個工具&…

Windows系統常用工具及命令和bat文件介紹

常用的windos工具 命令工具名稱描述powershellwindows的shell工具eventvwr事件查看器可以查看系統日志taskmgr任務管理器查看已經運行的進程和性能、應用歷史記錄、開機啟動等信息services.msc服務管理可以查看本地的服務regedt注冊表編輯器mstsc遠程桌面連接devmgmt.msc設備管…

昇思25天學習打卡營第7天|深度學習流程全解析:從模型訓練到評估

目錄 構建數據集 定義神經網絡模型 定義超參、損失函數和優化器 超參 損失函數 優化器 訓練與評估 構建數據集 首先從數據集 Dataset加載代碼&#xff0c;構建數據集。 代碼如下&#xff1a; #引入了必要的庫和模塊&#xff0c;像 mindspore 以及相關的數據處理模塊等等。…

Vue2-Vue Router前端路由實現思路

1.路由是什么&#xff1f; Router路由器&#xff1a;數據包轉發設備&#xff0c;路由器通過轉發數據包&#xff08;數據分組&#xff09;來實現網絡互連 Route路由&#xff1a;數據分組從源到目的地時&#xff0c;決定端到端路徑的網絡范圍的進程 | - 網絡層 Distribute分發…

無人機5公里WiFi低延遲圖傳模組,抗干擾、長距離、低延遲,飛睿智能無線通信新標桿

在科技日新月異的今天&#xff0c;我們見證了無數通信技術的飛躍。從開始的電報、電話&#xff0c;到如今的4G、5G網絡&#xff0c;再到WiFi的廣泛應用&#xff0c;每一次技術的革新都極大地改變了人們的生活方式。飛睿智能5公里WiFi低延遲圖傳模組&#xff0c;它以其獨特的優勢…