Realtime Controls

Realtime Controls

  • IHMC Home
  • All IHMC Docs
  • About IHMC

›Writing Real Time Control Code

Writing Real Time Control Code

  • Introduction
  • Preallocate everything
  • Do not use iterators
  • Do not change collections at runtime
  • Do not use the object versions of primitives (Double, Integer, Boolean, Long, Character, Byte, Float, Short)
  • Do not use locks

Do not use iterators

Exception: Iterating over arrays (object[] array = new object[x])

ArrayList iterators generate garbage. Instead of

ArrayList<Bar> foos;
for(Bar foo : foos)
{
    // foo
}

Use

ArrayList<Bar> foos;
for(int i = 0; i < foos.size(); i++)
{
    Bar foo = foos.get(i);
}

Make sure the underlying object is an ArrayList.

To clarify here: There is a difference between the general contract imposed by the List<T> type and the ArrayList<T> type. List<T> is just an Interface, a behavior contract with very little implementation contract except for certain asymptotic performance guarantees inherited from Collection, and iteration of this nature will be slightly slower because the "default" List type is the LinkedList, which has non-constant time direct access characteristics. An ArrayList<T> is guaranteed to be backed by an array T[], which guarantees constant lookup performance. If you need to create a collection of things and then iterate over it at a later time in real-time critical code, make sure that it is an ArrayList<T> and not some indeterminate List<T>, and iterate over it using a classic for loop so that you don't generate garbage (the Enhanced For Loop spawns a new weakly referenced object implementing the Iterator interface, and incurs two method dispatch calls per iteration (iterator.hasNext() and iterator.next(), hence the performance/GC issues).

Do not iterate over Maps and Sets

Iterating over maps and sets is expensive and generates garbage.

Exception: Iterating over an EnumMap using the following code

Constructor:

enum foo;
EnumMap<foo> bar = new EnumMap<foo>(foo.class);
foo[] enumValues = foo.values();

Main loop:

for(foo fooElement : enumValues)
{
    bar.get(fooElement);
}
← Preallocate everythingDo not change collections at runtime →
Realtime Controls
Docs
Quick StartSoftware Documentation
Community
GitHubFacebookTwitterYouTube
Copyright © 2018 IHMC Robotics