【问题标题】:What overhead ormLite has when querying or creating object with ForeignCollection?使用 ForeignCollection 查询或创建对象时 ormLite 有什么开销?
【发布时间】:2014-09-04 14:08:21
【问题描述】:

我有一张玩家桌和另一张游戏桌。它们之间存在Player----(1..n)[Game]关系(字段定义可能不完全正确):

// Player
@DatabaseField(generatedId = true)
private int id;
@DatabaseField
public String name;

@ForeignCollectionField(
    eager = true,
    maxEagerLevel = 3)
public ForeignCollection<Game> games;


// Game
@DatabaseField
String title;

@DatabaseField
String playerName;

我想获取并返回所有游戏的列表。什么时候让 ormLite 为 ForeignCollection 进行选择?或者这样做会更好:

    final List<Game> allGames = daoGames.getAllGroupedByName();
    final List<Player> allPlayers = gameDao.getAll();

    final HashMap<String, List<Game>> games = new HashMap<String, List<Game>>();
    for (Game currentGame : allGames) {
        final String player = currentGame.playerName;
        if (games.get(player) == null) {
            games.put(player, new ArrayList<Game>());
        }
        final List<Game> gamesOfPlayer = games.get(player);
        gamesOfPlayer.add(currentGame);
    }
    for (Player player : allPlayers) {
        player.games = games.get(player.name);
    }

我的猜测是 ormLite 会为每个玩家做一个查询。与一个 daoGames.getAllGroupedByName() 相比,它的开销是否很大(尽管 groupBy 甚至不需要)?

【问题讨论】:

    标签: performance ormlite foreign-collection


    【解决方案1】:

    我的猜测是 ormLite 会为每个玩家做一个查询。与一个 daoGames.getAllGroupedByName() 相比,它的开销是否很大(尽管 groupBy 甚至不需要)?

    这是正确的。 ORMLite 对每个 Player 结果的单独查询不能非常有效地做到这一点。您执行getAll() 并手动匹配它们的机制很可能会更快。

    除非你真的需要LinkedList 功能,否则我会使用ArrayList

    【讨论】:

    • 感谢您澄清这一点。
    • 关于列表实现:在这种特定情况下,列表将仅被遍历,即 O(n)(对于 ArrayList 也是如此)。使用 LinkedList 初始化要快一些,因为事先不知道大小,所以 ArrayList 需要重新分配(除非它是使用 allGames.size() 初始化的)。但你是对的,一般来说 ArrayList 可能更好。虽然 LinkedList 会生成更多垃圾对象,但需要收集这些对象。嗯。最后我可能会切换到 ArrayList :-)
    • 一般来说ArrayList 会好很多,除非您谈论的是在List 中删除或重新定位的大量对象。
    猜你喜欢
    • 2011-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-22
    • 2020-08-04
    • 1970-01-01
    相关资源
    最近更新 更多