自己写的测试例子备用

本文介绍了一个使用Erlang中的ETS(Erlang Term Storage)进行并发测试的示例程序。该程序通过gen_server行为实现了基于ETS的并发插入操作,并比较了使用call和cast两种方式的性能差异。此外,还提供了一个通过直接发送消息实现插入操作的测试案例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 


  1 %%通过 gen_server 发送消息来实现 insert

  2 
  3 -module(test_ets_gen).
  4 -behaviour(gen_server).
  5 -export([start_link/0,test_call/1,test_cast/1]).
  6 -export([init/1,handle_call/3,handle_cast/2,handle_info/2,terminate/2,code_change/3]).
  7 -record(state,{}).
  8 
  9 start_link()->
 10         gen_server:start_link({local,?MODULE},?MODULE,[],[]).
 11 
 12 test_call(Num)->
 13         Start = timestamp_in_millinsec(),
 14         [gen_server:call(?MODULE,{new,1}) || _X<- lists:seq(1,Num)],
 15         End = timestamp_in_millinsec(),
 16         (End-Start)/1000.
 17 test_cast(Num)->
 18         Start = timestamp_in_millinsec(),
 19         [gen_server:cast(?MODULE,{new,1}) || _X<- lists:seq(1,Num)],
 20         End = timestamp_in_millinsec(),
 21         (End-Start)/1000.
 22 
 23 init([])->
 24         State=ets:new(test,[protected,set,named_table]),
 25         ets:insert(State,{info,0}),
 26         ets:insert(State,{starttime,timestamp_in_millinsec()}),
 27         {ok,State}.
 28 handle_call({new,Num},_From,State)->
 29         Conns = ets:lookup_element(State,info,2),
 30         Sum = Conns + Num,
 31         ets:insert(State,{info,Sum}),
 32         {reply,ok,State}.
 33 handle_cast({new,Num},State)->
 34         Conns = ets:lookup_element(State,info,2),
 35         Sum = Conns + Num,
 36         ets:insert(State,{info,Sum}),
 37         {noreply,State}.
 38 handle_info(_info,State)->
 39         {noreply,State}.
 40         
 41 terminate(_Reaseon,_State)->
 42         ok.     
 43 code_change(_OldVsn,State,_Exra)->
 44         {ok,State}.
 45         
 46 timestamp_in_millinsec()->
 47         {MegaSec, Sec, MicoSec} = erlang:now(),
 48         MegaSec * 1000000000 + Sec*1000 +MicoSec div 1000.


%%通过 ! 发送消息来实现 insert

-module(test_ets1).
-export([start/2,insert_ets_p/3]).
-compile(export_all).
start(Num,Process)->
        Tab=new_ets(),
        Be=timestamp_in_millinsec(),
        [begin spawn(?MODULE,insert_ets_p,[Num,self(),Tab]),recv(Num,Process) end || _X <- lists:seq(1,Process)],
%%      recv(Num,Process),
        En=timestamp_in_millinsec(),
        Re=En -Be,
        Re.
recv(Num,_Process)->
        receive
                R ->
                        insert_ets(Num,R),
                        ets:insert(test,{endt,timestamp_in_millinsec()}),
                        io:format("recv---~p~n",[R])
        after 100 ->
                        io:format("timeout~n")
        end.

insert_ets_p(Num,From,Tab)->
        io:format("------~p----~n",[From]),
        [From ! Tab || _X<- lists:seq(1,Num)].
new_ets()->
        Tab = ets:new(test,[protected,set,named_table]),
        ets:insert(Tab,{info,0,self()}),
        ets:insert(Tab,{start,timestamp_in_millinsec()}),
        Tab.
insert_ets(Num,Tab)->
        Conns = ets:lookup_element(test,info,2),
        Sum = Conns+Num,
        io:format("fffffff====~p====~p==",[Sum,self()]),
        %%ets:insert(test,{info,0}).
        ets:insert(Tab,{info,Sum,self()}).

timestamp_in_millinsec()->
        {MegaSec, Sec, MicoSec} = erlang:now(),
        MegaSec * 1000000000 + Sec*1000 +MicoSec div 1000.
~                                                          


多个线程共享ets导致出现脏数据
-module(test_ets).
-export([start/2,insert_ets_p/3]).
-compile(export_all).
start(Num,Process)->
        Tab=new_ets(),
        Be=timestamp_in_millinsec(),
        [spawn(?MODULE,insert_ets_p,[Num,self(),Tab]) || _X <- lists:seq(1,Process)],
        recv(Num,Process),
        En=timestamp_in_millinsec(),
        Re=En -Be,
        Re.
recv(_Num,_Process)->
        receive
                R -> io:format("recv---~p~n",[R])
        after 100 ->
                io:format("timeout~n")
        end.

insert_ets_p(Num,From,Tab)->
        io:format("-----~p--------~n-",[From]),
        [insert_ets(1,Tab) || _X<- lists:seq(1,Num)],
        From ! test.
new_ets()->
        Tab = ets:new(test,[public,set,named_table]),
        ets:insert(Tab,{info,0}),
        Tab.
insert_ets(Num,Tab)->
        Conns = ets:lookup_element(test,info,2),
        Sum = Conns+Num,
        io:format("fffffff====~p=====~p======~n",[Sum,self()]),
        %%ets:insert(test,{info,0}).
        ets:insert(Tab,{info,Sum}).

timestamp_in_millinsec()->
        {MegaSec, Sec, MicoSec} = erlang:now(),
        MegaSec * 1000000000 + Sec*1000 +MicoSec div 1000.
~                                                                          

内容概要:该论文研究增程式电动汽车(REEV)的能量管理策略,针对现有优化策略实时性差的问题,提出基于工况识别的自适应等效燃油消耗最小策略(A-ECMS)。首先建立整车Simulink模型和基于规则的策略;然后研究动态规划(DP)算法和等效燃油最小策略;接着通过聚类分析将道路工况分为四类,并设计工况识别算法;最后开发基于工况识别的A-ECMS,通过高德地图预判工况类型并自适应调整SOC分配。仿真显示该策略比规则策略节油8%,比简单SOC规划策略节油2%,并通过硬件在环实验验证了实时可行性。 适合人群:具备一定编程基础,特别是对电动汽车能量管理策略有兴趣的研发人员和技术爱好者。 使用场景及目标:①理解增程式电动汽车能量管理策略的基本原理;②掌握动态规划算法和等效燃油消耗最小策略的应用;③学习工况识别算法的设计和实现;④了解基于工况识别的A-ECMS策略的具体实现及其优化效果。 其他说明:此资源不仅提供了详细的MATLAB/Simulink代码实现,还深入分析了各算法的原理和应用场景,适合用于学术研究和工业实践。在学习过程中,建议结合代码调试和实际数据进行实践,以便更好地理解策略的优化效果。此外,论文还探讨了未来的研究方向,如深度学习替代聚类、多目标优化以及V2X集成等,为后续研究提供了思路。
氮氧传感器(Oxygen Sensor 或 NOx Sensor)是一种用于测量车辆废气中氧气或氮氧化物含量的传感器,通常用于汽车排放控制系统。编测试用例时,我们主要关注其功能的准确性和可靠性。下面是一个简单的氮氧传感器测试用例的例子: 1. **正常工作状态测试**: - 测试条件:发动机稳定运转,输入标准混合气比例。 - 预期结果:传感器读数应在正常范围内波动,表示能够准确响应混合气成分变化。 - 行动:读取传感器数据并验证是否接近理论值。 2. **异常工况下的测试**: - 测试条件:如怠速、加速、减速、关闭节气门等。 - 预期结果:在各种操作下,传感器应能适应并调整读数,显示适当的补偿信号。 - 行动:检查传感器在极端条件下读数的变化趋势。 3. **稳定性测试**: - 测试条件:连续监测一段时间内的读数变化。 - 预期结果:传感器读数应该保持相对稳定,无明显漂移。 - 行动:记录长时间内的数据,并分析稳定性。 4. **故障模拟测试**: - 模拟传感器失效或错误信号。 - 预期结果:系统应识别到异常并采取相应措施,如点亮警告灯或切换至备用模式。 - 行动:断开传感器连接,观察车辆控制系统的反应。 5. **环境影响测试**: - 测试条件:高温、低温、湿度变化等极端气候。 - 预期结果:传感器能在各种环境下仍能正常工作。 - 行动:在实验室或自然环境中模拟恶劣天气条件进行测试
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值