华为昇腾310B初体验,OrangePi AIpro开发板使用测评

0、写在前面

很高兴收到官方的OrangePi AIpro开发板测试邀请,在过去的几年中,我在自己的博客写了一系列有关搭载嵌入式Linux系统的SBC(单板计算机)的博文,包括树莓派4系列、2K1000龙芯教育派、Radxa Rock5B、BeagleBone等。

OrangePi AIpro开发板最吸引我的地方是它使用了华为昇腾的处理器和支持华为昇腾AI技术路线。

开发板本身质感满满,整体尺寸和Radxa Rock5B一致,板上接口丰富,有type-c电源接口、2*HDMI 2.0、音频接口、USB Type-C 3.0(非全功能)、千兆网口、Wi-Fi5&BT4.2模块(RTL8821)、TF插槽、eMMC模块接口、M.2插槽、40PIN引脚等。

本次测评中,我会从软硬件出发体验OrangePi AIpro开发板,针对开发板的优点和缺点给出自己的观点。

1、使用SSH和VNC连接开发板

得益于官方系统已经内置了SSH和VNC服务,在接通网线、电源之后,可以通过路由器后台管理界面获取OrangePi AIpro开发板的IP,同一网段下的电脑即可使用SSH或VNC远程控制香橙派 AIpro开发板。

官方系统具有两个账号:root / Mind@123 , HwHiAiUser / Mind@123;密码相同。

可以使用MobaXterm、Putty等软件或终端进行SSH远程连接,SSH端口为22。

我使用RealVNC Viewer远程连接香橙派 AIpro开发板桌面,VNC Server为IP::5901,点击OK之后点击新建的连接输入密码:Mind@123 。

完成上图所示操作后,即可进入桌面,默认用户为ROOT,VNC会方便我们进行一些可视化操作。

注意:如果VNC登录后出现卡顿情况或者无法操作,可以重启服务

# 停止正在运行的服务,-kill后面的数字可以在VNC远程连接窗口左上角查看
(base) root@orangepiaipro:~# vncserver -kill :1
Killing Xtightvnc process ID 917# 重新启动刚才停止的服务
(base) root@orangepiaipro:~# vncserver :1New 'X' desktop is orangepiaipro:1Starting applications specified in /root/.vnc/xstartup
Log file is /root/.vnc/orangepiaipro:1.log

通过使用SSH和VNC两种方式,我们就可以把开发板放在合适的地方,通过自己的个人电脑进行后续的测试工作

2、使用SSD烧录Ubuntu系统镜像

虽然测试提供了安装好系统的32GB TF卡,但是可用空间已经比较小了,如下图所示,可用空间还剩下10几GB

出于空间和系统流畅性角度考虑,我将使用一块江波龙的64GB NVME协议 SSD固态硬盘作为系统盘。

开发板M.2接口在Linux系统中默认nvme协议,使用sata协议需要修改配置,在window系统中使用balenaEtcher进行烧录

把boot1拨到右端,boot2拨到左端后,上电成功进入系统,使用df -hlsblk命令查看系统空间和磁盘情况

❗注意❗

在开发板用户手册中说明:NVMe SSD目前测试了樊想、金士顿和三星的,只有三星的NVMe SSD能稳 定运行Linux系统。

我这里使用的江波龙64GB Nvme SSD只是做个人测试使用。

3、OrangePi AIpro开发板功耗

这里我把TF和SSD区分开进行测试,功耗测试仪器为合宙IoT Power功耗测试仪。

3.1 使用TF的情况

刚上电开机时,功耗比较高,检测到的最高值在11.7W左右。

进入桌面后,在没有其他操作的情况下,功耗约为7.7W-8W,使用网页应用功耗在10.5W左右。

3.2 使用SSD的情况

刚上电开机时,功耗峰值在13W左右。

进入桌面后,在没有其他操作的情况下,功耗约为8.6W,使用网页应用功耗在11W左右。

3.3 分析

首先是开机时的功耗比较高,个人猜测是风扇的原因,上电到系统启动完成的这段时间风扇的转速很快,其他时间风扇转速比较平缓,以TF卡系统为例,风扇高速转动时和待机缓转时,总功耗差距4W左右。

其次是当打开软件,系统负载增加时,功耗也会有所增加;

最后根据固态硬盘额定功率的不同,开发板的总功耗也会相应增加,以我使用的江波龙64GB NVME SSD来说,对比TF卡,在上述三种场景下功耗增加分别在11.11%、11.68%、4.8%左右。

4、UnixBench跑分

UnixBench是一个广泛使用的基准测试工具,用于评估类Unix操作系统(如Linux、BSD等)的性能。它通过运行一系列的测试来测量系统的各种性能指标,包括CPU、内存、文件系统、图形和多任务处理能力。UnixBench的测试结果可以帮助系统管理员和开发人员了解其系统的性能水平,并与其他系统进行比较。

# 下载阿里云版本unixbench
wget https://github.com/aliyun/byte-unixbench/releases/download/v5.1.6/UnixBench-5.1.6.tar.gztar -zxvf UnixBench-5.1.6.tar.gzcd UnixBench-5.1.6/UnixBench
./Run

分数仅供参考:单核776.5分,多核1641.1分,跑分结果截图如下:

在相同条件下,对比使用RK3588的Rock 5B开发板,如下图所示。昇腾310B是4核且默认情况还会分配一个AI CPU,RK3588是8核,比较多核性能意义不大,就我本次测试来说,单核两者相差约23.9%。

5、使用USB摄像头和安装OpenCV

这里使用的是UVC免驱USB摄像头,接入摄像头

# 检测外部摄像头设备的命令
ls /dev/video*

官方手册上说/dev/video1是来采集metadata的,那我们插入的设备为:/dev/video0

使用fswebcam软件,在安装fswebcam时发现系统已经安装过了

# 在/home/HwHiAiUser目录下生成一张当前摄像头拍摄到的实时照片
fswebcam -d /dev/video0 --no-banner -r 1920x1080 -S 10 /home/HwHiAiUser/image.jpg

在我执行pip3 list时,发现系统已经安装了numpy 1.22.4,opencv-python-headless 4.9.0.80,opencv-python-headless是一个不带图形界面的版本的OpenCV,它可以用来进行图像处理和计算机视觉任务,但是不能用来显示图像或视频,这对于运行在无图形界面的服务器上的应用程序很方便,因为它可以节省资源。在Python程序中使用方式也是import cv2

下面我提供一个测试程序,处理视频流并保存为文件。

# -*- coding: utf-8 -*-
import cv2
import time# 打开摄像头
cap = cv2.VideoCapture(0)if not cap.isOpened():print("Cannot open camera")exit()# 定义视频编码器和输出文件
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output.avi', fourcc, 20.0, (640, 480))# 获取当前时间
start_time = time.time()while True:# 读取视频帧ret, frame = cap.read()if not ret:print("Cannot read frame")break# 写入视频帧out.write(frame)# 检查是否时间已经超过5秒if time.time() - start_time > 5:print("Recorded 5 seconds, exiting")break# 释放摄像头和视频写入器
cap.release()
out.release()

sudo apt-get install mpv安装mpv,mpv output.avi进行视频播放。

如果你需要使用OpenCV的GUI功能,你应该安装完整的opencv-python包,使用pip install opencv-python进行安装。

6、使用开发板点亮RGB灯

OrangePi AIpro开发板具有40个Pin接口引脚,如下图所示。我将使用12、13、15三个GPIO引脚和14 GND 引脚进行简单的测试点亮RGB灯。

引脚

功能

GPIO

GPIO序号

12

GPIO7_03

227

13

GPIO1_06

38

14

GND

15

GPIO2_15

79

在系统中预装了gpio_operate工具可以读取、设置GPIO的输入输出方向和置0置1

# 切换root用户
su 
# 获取12、13、15引脚GPIO方向,0:输入方向,1:输出方向
gpio_operate get_direction 7 3
gpio_operate get_direction 1 6
gpio_operate get_direction 2 15

设置12、13、15引脚GPIO方向为输出方向

gpio_operate set_direction 7 3 1
gpio_operate set_direction 1 6 1
gpio_operate set_direction 2 15 1

查询12、13、15引脚GPIO 电平,如下图所示,都为低电平。

gpio_operate get_value 7 3
gpio_operate get_value 1 6
gpio_operate get_value 2 15

R接12引脚、G接13引脚、B接15引脚,GND接14 GND。

# 设置12、13、15引脚GPIO 为高电平
gpio_operate set_value 7 3 1
gpio_operate set_value 1 6 1
gpio_operate set_value 2 15 1# 设置12、13、15引脚GPIO 为低电平
gpio_operate set_value 7 3 0
gpio_operate set_value 1 6 0
gpio_operate set_value 2 15 0

编写shell脚本测试,给脚本添加可执行权限:chmod +x gpio_RGB.sh

#!/bin/bash# 数组包含需要执行的命令
commands=("gpio_operate set_value 7 3 1""gpio_operate set_value 7 3 0""gpio_operate set_value 1 6 1""gpio_operate set_value 1 6 0""gpio_operate set_value 2 15 1""gpio_operate set_value 2 15 0"
)# 无限循环执行命令,每隔0.5秒执行一条,ctrl+c结束执行
while true
dofor cmd in "${commands[@]}"doeval $cmdsleep 0.5done
done

7、使用Docker并配置开发板为 MQTT服务器

通过命令查询,发现系统已经默认安装了docker,并且有一个测试的hello-world镜像。

(base) root@orangepiaipro:/home/HwHiAiUser# docker --version
Docker version 25.0.3, build 4debf41
(base) root@orangepiaipro:/home/HwHiAiUser# docker images
REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
hello-world   latest    ee301c921b8a   12 months ago   9.14kB

下载Docker 图形化web管理 portainer

#下载 Docker 图形化界面 portainer
sudo docker pull portainer/portainer
#创建 portainer 容器
sudo docker volume create portainer_data
#运行 portainer
sudo docker run -d -p 9000:9000 --name portainer --restart always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer

运行之后在浏览器中输入IP:9000 进入界面。首次访问需要设定登录密码

配置EMQX 开源版,EMQX (Erlang/Enterprise/Elastic MQTT Broker)是基于 Erlang/OTP 平台开发的开源物联网 MQTT 消息服务器。

# 获取 Docker 镜像
docker pull emqx/emqx:5.6.1
# 启动 Docker 容器
docker run -d --name emqx -p 1883:1883 -p 8083:8083 -p 8084:8084 -p 8883:8883 -p 18083:18083 emqx/emqx:5.6.1

用IP:18083 进入EMQX服务器后台,默认账号:admin ,默认密码:public

测试代码-发布消息

import paho.mqtt.client as mqtt
import time#   链接回调
def on_connect(client, userdata, flags, rc):print ("链接")print("Connected with result code: " + str(rc))#   消息内容回调
def on_message(client, userdata, msg):print("消息内容")print(msg.topic + " " + str(msg.payload))#   订阅回调
def on_subscribe(client, userdata, mid, granted_qos):print("订阅")print("On Subscribed: qos = %d" % granted_qos)pass#   取消订阅回调
def on_unsubscribe(client, userdata, mid, granted_qos):print("取消订阅")print("On unSubscribed: qos = %d" % granted_qos)pass#   发布消息回调
def on_publish(client, userdata, mid):print("发布消息")print("On onPublish: qos = %d" % mid)pass#   断开链接回调
def on_disconnect(client, userdata, rc):print("断开链接")print("Unexpected disconnection rc = " + str(rc))passclient = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
client.on_publish = on_publish
client.on_disconnect = on_disconnect
client.on_unsubscribe = on_unsubscribe
client.on_subscribe = on_subscribe
# keepalive 心跳间隔,单位是秒,如果 broker 和 client 在这段时间内没有任何通讯,client 会给 broker 发送一个 ping 消息
# retain  如果设为 Ture ,这条消息会被设为保留消息client.connect('192.168.5.220', 1883, 60)  # 60为keepalive的时间间隔
while True:client.publish(topic='mqtt', payload='OrangePi AiPro', qos=0, retain=False)time.sleep(5)

测试代码-接收消息

import paho.mqtt.client as mqtt#   链接回调
def on_connect(client, userdata, flags, rc):print("Connected with result code: " + str(rc))
#   消息信息回调
def on_message(client, userdata, msg):print(msg.topic + " " + str(msg.payload))#   订阅回调
def on_subscribe(client, userdata, mid, granted_qos):print("On Subscribed: qos = %d" % granted_qos)pass#   取消订阅回调
def on_unsubscribe(client, userdata, mid):print("取消订阅")print("On unSubscribed: qos = %d" % mid)pass#   发布消息回调
def on_publish(client, userdata, mid):print("发布消息")print("On onPublish: qos = %d" % mid)pass#   断开链接回调
def on_disconnect(client, userdata, rc):print("断开链接")print("Unexpected disconnection rc = " + str(rc))passclient = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
client.on_publish = on_publish
client.on_disconnect = on_disconnect
client.on_unsubscribe = on_unsubscribe
client.on_subscribe = on_subscribeclient.connect('192.168.5.220', 1883, 60)  # 60为keepalive的时间间隔
#当 qos>0 时,发送消息队列的最大值,默认是 0 ,表示无限制。当队列满时,旧消息会丢弃。
client.subscribe('mqtt', qos=0)
#loop_forever()  =>  该函数是保持永久连接, 阻塞式,可结合多线程或多进程的方式使用
client.loop_forever()  # 保持连接

经过测试,我们的部署是没有问题的

8、昇腾310B独特的机制:AI CPU和Control CPU切换

npu-smi是昇腾AI处理器的系统管理工具,类似于NVIDIA GPU的 nvidia-smi,通过npu-smi info命令我们可以查看到AI处理器名称为310B4(8T算力版本)。

根据开发手册所说:OrangePi AiPro使用的昇腾SOC总共有4个CPU,这4个CPU既可以设置为control CPU,也可以设置为AICPU。默认情况下,control CPU和AI CPU的分配数量为 3:1。

# 查看control CPU和AI CPU的分配数量
(base) root@orangepiaipro:/home/HwHiAiUser# npu-smi info -t cpu-num-cfg -i 0 -c 0Current AI CPU number          : 1Current control CPU number     : 3Current data CPU number        : 0# 查询AI CPU占用率
(base) root@orangepiaipro:/home/HwHiAiUser# npu-smi info -t usages -i 0 -c 0Memory Capacity(MB)            : 7545Memory Usage Rate(%)           : 27Hugepages Total(page)          : 15Hugepages Usage Rate(%)        : 100Aicore Usage Rate(%)           : 0Aicpu Usage Rate(%)            : 0Ctrlcpu Usage Rate(%)          : 0Memory Bandwidth Usage Rate(%) : 1# 查询芯片的算力档位
(base) root@orangepiaipro:/home/HwHiAiUser# npu-smi info -t nve-level -i 0 -c 0nve level                      : 8T_1.0GHz# 设置AI CPU为0,最多可以设置3个AI CPU(3:1:0,最后的0为data CPU,固定配置为 0)        
sudo npu-smi set -t cpu-num-cfg -i 0 -c 0 -v 0:4:0

查阅资料,我发现昇腾310有8核心版本和4核心版本,OrangePi AiPro搭载的是4核心版本。可以根据我们的实际需求,灵活切换control CPU和AI CPU的分配数量,最多可以设置3个AI CPU。

9、AI应用样例体验

OrangePi AiPro开发板系统提供了9个AI应用样例,我们可以使用Jupyter notebook快速体验。

9个AI样例分别是目标检测、文字识别、目标分类、图像曝光增强、卡通图像生成、蛋白质分类评估、细胞图像分割、人像分割与背景替换和语音识别。

我选取其中1个进行体验。启动Jupyter Lab,如下图所示:

复制地址在开发板浏览器中打开

点击左侧的01 yolov5后,双击打开main.ipynb。

首先就是对act工具转换模型为om模型的介绍,本展现了模型推理过程的代码。

点击红框内的箭头运行案例,得到一段识别后的视频,通过修改infer_mode可以选择图片、视频或摄像头。

infer_imageinfer_frame_with_vis函数中添加时间记录,打印处理的时间

import timedef infer_image(img_path, model, class_names, cfg):"""图片推理"""# 记录开始时间start_time = time.time()# 图片载入image = cv2.imread(img_path)# 数据预处理img, scale_ratio, pad_size = preprocess_image(image, cfg)# 模型推理output = model.infer([img])[0]output = torch.tensor(output)# 非极大值抑制后处理boxout = nms(output, conf_thres=cfg["conf_thres"], iou_thres=cfg["iou_thres"])pred_all = boxout[0].numpy()# 预测坐标转换scale_coords(cfg['input_shape'], pred_all[:, :4], image.shape, ratio_pad=(scale_ratio, pad_size))# 图片预测结果可视化draw_prediction(pred_all, image, class_names)# 记录结束时间end_time = time.time()# 计算并输出推理时间inference_time = end_time - start_timeprint(f"Inference time: {inference_time:.4f} seconds")def infer_frame_with_vis(image, model, labels_dict, cfg, bgr2rgb=True):# 记录开始时间start_time = time.time()# 数据预处理img, scale_ratio, pad_size = preprocess_image(image, cfg, bgr2rgb)# 模型推理output = model.infer([img])[0]output = torch.tensor(output)# 非极大值抑制后处理boxout = nms(output, conf_thres=cfg["conf_thres"], iou_thres=cfg["iou_thres"])pred_all = boxout[0].numpy()# 预测坐标转换scale_coords(cfg['input_shape'], pred_all[:, :4], image.shape, ratio_pad=(scale_ratio, pad_size))# 图片预测结果可视化img_vis = draw_bbox(pred_all, image, (0, 255, 0), 2, labels_dict)# 记录结束时间end_time = time.time()# 计算并输出推理时间inference_time = end_time - start_timeprint(f"Inference time for frame: {inference_time:.4f} seconds")return img_vis

此时打印了视频推理每一帧所用的时间,大约0.05S,每秒19fps左右

10、写在最后

在这几天的体验OrangePi AiPro开发板的过程中,上手体验非常好,优点如下:

  • 官方提供的系统镜像已经做了很多预先的配置工作,可以更快上手。如默认开启的ssh、vnc服务等,内置的docker、conda、torch_npu、MindSpore等等,这对新手来说就少了很多配环境的折磨,可以更快的进入到AI应用的学习和实践。

  • 对于发布半年左右的开发板,提供的开发资料非常详细。用户手册写的非常详细了,对 Linux 内核源码包和Linux 镜像编译脚本都做了详细的说明。

  • 支持昇腾技术路线。昇腾从硬件底层到软件平台应用有一整套技术解决方案,有昇腾处理器、异构计算机构CANN、深度学习框架MindSpore等,OrangePi AiPro不单单是一个“树莓派”,更是帮助开发者去实践昇腾AI技术的高性价比载体。

  • OrangePi AiPro开发板背靠昇腾社区和香橙派社群,技术支持更多。昇腾社区提问帖子基本都有跟帖,香橙派目前在国内的口碑也非常不错,产品线和支持都很给力,在遇到问题的时候,更容易解决问题。

OrangePi AiPro开发板搭载的昇腾310B4芯片也给我很多惊喜,可以根据实际需求,灵活切换control CPU和AI CPU的分配数量。在最近,更是可以通过固件更新的方式,将频率从1.0Ghz提高到1.6Ghz,实现单核性能50%以上的提升。

但是在测评中,也有一些问题和相关的建议:

  • 在当前系统使用中,HDMI0不能输出音频信号,HDMI1接口不能输出桌面视频信号。希望能在下个版本的系统中完成适配。

  • 提供了一个USB3.0 Type-c接口,如果能在后续硬件版本中实现全功能Type-c功能就更好了。

  • 目前的开发者手册虽然很详细,但是希望能增加一些昇腾相关内容,建议增加npu-smi工具使用和CANN、MindSpore相关内容。

总结一下,OrangePi AiPro是一块优秀的SBC,同时它的价格也会使它成为入门昇腾技术路线的最佳选择之一,非常适合学生学习和竞赛使用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/340071.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

001----flask

flask---001 flask与django对比今日概要问答今日详细1.flask快速使用1.2 快速使用flask1.3 用户名密码登录 flask与django对比 django是个大而全的框架,flask是一个轻量级的框架。 django内部为我们提供了非常多的组件:orm/session/cookie/admin/from/mo…

mysql 分区

目标 给一个表(半年有800万)增加分区以增加查询速度 约束 分区不能有外键否则会报错 https://blog.csdn.net/yabingshi_tech/article/details/52241034 主键 按照时间列进行分区 https://blog.csdn.net/winerpro/article/details/135736454 参看以…

时序预测 | Matlab灰色-马尔科夫预测

目录 预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Matlab灰色-马尔科夫预测 灰色马尔科夫预测(Grey-Markov Prediction)是一种用于时间序列预测的方法,它结合了灰色系统理论和马尔科夫链模型。灰色系统理论是一种非参数化的预测方法…

[vue2项目]vue2+supermap[mapboxgl]+天地图之地图的初始化

Supermap参考教程 天地图 一、安装 1、终端:npm install supermap/vue-iclient-mapboxgl 2、在package.json文件的dependencies查看supermap/vue-iclient-mapboxgl依赖是否安装成功。 3、在mian.js全局引入 import VueiClient from supermap/vue-iclient-mapboxgl; Vue.use(…

研学活动报名收集材料怎么写?教程来了!

研学活动作为学校教育的重要组成部分,不仅能够拓宽学生的视野,还能促进家校沟通。学生们报名还是十分积极踊跃的,然而研学活动报名收集材料该怎么写却困扰着不少老师,其实只需要把姓名和联系方式等收集全就可以了,主要…

typescript --object对象类型

ts中的object const obj new Object()Object 这里的Object是Object类型,而不是JavaScript内置的Object构造函数。 这里的Object是一种类型,而Object()构造函数表示一个值。 Object()构造函数的ts代码 interface ObjectConstructor{readonly prototyp…

UMG绝对坐标与局部空间

在 Unreal Engine 的 UMG(Unreal Motion Graphics)中,“绝对坐标”和“局部空间”是两个常见的概念,主要用于描述 UI 元素的位置和大小。 概念与区别 绝对坐标(Absolute Coordinates):这是指相…

[数据集][目标检测]RSNA肺炎检测数据集VOC+YOLO格式6012张1类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):6012 标注数量(xml文件个数):6012 标注数量(txt文件个数):6012 标注…

彩光大放异彩!《智慧园区以太全光网络建设技术规程》应用案例征集活动结果公布

近日,中国建筑业协会绿色建造与智能建筑分会正式公布了《智慧园区以太全光网络建设技术规程》应用案例征集活动的结果。本次活动旨在推广和应用该规程,进一步推动智慧园区的数字化、智慧化、绿色化建设。众多优秀项目在征集活动中脱颖而出,展示了规程在实际应用中的显著成效。评…

如果任务过多,队列积压怎么处理?

如果任务过多,队列积压怎么处理? 1、内存队列满了应该怎么办2、问题要治本——发短信导致吞吐量降低的问题不能忽略!!3、多路复用IO模型的核心组件简介1、内存队列满了应该怎么办 如图: 大家可以看到,虽然现在发短信和广告投递,彼此之间的执行效率不受彼此影响,但是请…

vue3+typescript 使用Codemirror

安装 // npm npm install codemirror-editor-vue3 codemirror^5.65.12// ts版 还需安装: npm install types/codemirror全局注册 修改main.ts: import { createApp } from vueimport App from ./App.vueimport { InstallCodemirro } from "code…

M-G364PD惯性测量单元:相机及微小层面的革命性应用

在现代科技飞速发展的今天,精准控制和精确测量是众多高端设备实现卓越性能的关键。爱普生推出的M-G364PD惯性测量单元(IMU),因其卓越的性能和微小尺寸,成为相机以及其他微小层面应用的理想选择,为科技创新提…

JVMの堆、栈内存存储

1、JVM栈的数据存储 通过前面的学习,我们知道,将源代码编译成字节码文件后,JVM会对其中的字节码指令解释执行,在解释执行的过程中,又利用到了栈区的操作数栈和局部变量表两部分。 而局部变量表又分为一个个的槽位&…

JavaScript 基础 - 对象

对象 对象是一种无序的数据集合&#xff0c;可以详细的描述描述某个事物。 注意数组是有序的数据集合。它由属性和方法两部分构成。 语法 声明一个对象类型的变量与之前声明一个数值或字符串类型的变量没有本质上的区别。 <script>let 对象名 {属性名&#xff1a;属性值…

DynamiCrafter ComfyUI 教程 | 对图片转视频的效果进行精细化控制

近日&#xff0c;由北大、腾讯AI Lab联合推出的 AI 视频生成工具 DynamiCrafter 一经上线便引起了巨大反响。只需要输入一张普普通通的静态图&#xff0c;加上几句简单的文字引导&#xff0c;瞬间就能生成超逼真的动态视频&#xff0c;简直不要太厉害&#xff01; 静态图 fire…

renren-fast-vue启动报错

问题描述 拉取人人开源vue项目启动失败 报错信息 版本信息 序号名称版本号1node14.21.3 启动方案 1.拉取项目 git clone https://gitee.com/renrenio/renren-fast-vue.git 2.执行安装依赖命令 npm install 3.此时报错 chromedriver2.27.2 install: node install.js 4.手动…

kafka集群内外网分流方案——筑梦之路

前言 在现代分布式系统架构中&#xff0c;Kafka作为一款高性能的消息队列系统&#xff0c;广泛应用于大数据处理、实时流处理以及微服务间的异步通信场景。特别是往往企业级应用中&#xff0c;业务网段和内网通信网段不是同一个网段&#xff0c;内网的机器想要访问业务数据只能…

Java内存模型(JMM)

Volatile关键字 如何保证变量的可见性 在Java中&#xff0c;Volatile关键字可以保证变量的可见性&#xff0c;如果我们将变量声明为volatile&#xff0c;这就指示JVM&#xff0c;这个变量是共享且不稳定的&#xff0c;**每次使用它都到主存中进行读取&#xff08;禁止读取本地…

二分查找算法介绍(边界值、循环条件、值的变化、二分查找的原理、异常处理)

一、二分查找法原理介绍 二分查找是经典的查找算法之一&#xff0c;其原理也非常简单。 对于已排序的数组&#xff08;假设是整型&#xff0c;如果非整型&#xff0c;如果有排序和大小比较的定义&#xff0c;也可以使用二分查找&#xff09;&#xff0c;我们每次判断中间值与目…

基于JSP的母婴用品网站系统

你好呀&#xff0c;我是计算机学长猫哥&#xff01;如果有需求可以文末加我。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;JSP技术 工具&#xff1a;IDEA/Eclipse、Navicat、Maven 系统展示 首页 管理员功能界面 用户功能界面 前台首页功能界面 …