%%% -------------------------------------------------------
%%% @author huangyongxing@yeah.net
%%% @doc
%%% 粗略对比测试通过data_scene_landform直接读配置
%%% 与通过预处理后的进程字典读取数据的效率，做简单对比
%%%
%%% 工作用PC，通常测试结果如下：
%%% > test_landform:test(100000000).
%%% "get landform" [total: 2875(2891)ms avg: 0.029(0.029)us]
%%% "get proc dict" [total: 6937(7656)ms avg: 0.069(0.077)us]
%%% ========================================================================
%%%         get landform =   2875.00ms [  100.00%]   2891.00ms [  100.00%]
%%%        get proc dict =   6937.00ms [  241.29%]   7656.00ms [  264.82%]
%%% ========================================================================
%%% 
%%% 结论：
%%% 在伪造近乎同样量级数据、尽量采用相同方式测试的情况下，
%%% 经过多轮测试发现，直接读取配置的方式更加高效，
%%% 进程字典方式大约需要2.6倍的时间消耗。
%%%
%%% 实际上，
%%% 旧项目的进程字典读取配置方式比这里的消耗应该更大一些（无论是内存还是CPU时间），
%%% 该方式需要先取出进程字典中pos数据（一个map结构），再在map中find数据。
%%%
%%% NOTE: 测试其实不完全严谨模拟真实使用情景，
%%%       读取的配置点都是一开始随机生成的点，对测试结果有细微影响，
%%%       但是通过多次反复测试，可以大致排除这一方面的影响，达到基本的测试对比目的。
%%% @end
%%% @since 2019-11-08
%%% -------------------------------------------------------
-module(test_landform).
-export([
        test/1
    ]).

test(Times) ->
    % SceneIds = data_scene:get_id_list(),
    % %% 随机取一个场景坐标进行测试
    % RandSceneId = urand:list_rand(SceneIds),
    % 取当前具有代表性的配置场景
    RandSceneId = 1001,
    MaxX = 200,
    MaxY = 250,
    RandX = urand:rand(1, MaxX),
    RandY = urand:rand(1, MaxY),
    %% 在进程字典中写入一定量的数据
    [
        case data_scene_landform:get(RandSceneId, X, Y) of
            1   -> ignore;      % 不可行走区域排除，缩减进程字典数据量
            Val -> put({X, Y}, Val)
        end
        || X <- lists:seq(1, MaxX), Y <- lists:seq(1, MaxY)
    ],
    %% 开始测试
    ptester:run(Times, [
            {"get landform",  fun(_) -> sub_test(RandSceneId, RandX, RandY) end},
            {"get proc dict", fun(_) -> sub_test2(RandSceneId, RandX, RandY) end}
        ]),
    ok.

sub_test(Id, X, Y) ->
    data_scene_landform:get(Id, X, Y).

sub_test2(_RandSceneId, X, Y) ->
    get({X, Y}).
