Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

replace String.format with faster Long.toHexString #37

Merged
merged 2 commits into from
Sep 9, 2022
Merged

Conversation

rudygt
Copy link
Contributor

@rudygt rudygt commented Sep 7, 2022

Description of changes:

I was running the benchmarks with a profiler attached and noticed that String.format was showing up, traced it to a simple decimal to hexadecimal conversion. I replaced that with the faster alternative Long.toHexString and a hand crafted left pad with fixed size as we know the desired lenght at 14.

Benchmark / Performance (for source code changes):

CL2Benchmark

BEFORE:

Reading citylots2
Read 213068 events
EXACT events/sec: 257639.7
WILDCARD events/sec: 199129.0
PREFIX events/sec: 306572.7
SUFFIX events/sec: 291474.7
EQUALS_IGNORE_CASE events/sec: 252450.2
NUMERIC events/sec: 3242.6
ANYTHING-BUT events/sec: 139169.2
COMBO events/sec: 3248.6

AFTER:

Reading citylots2
Read 213068 events
EXACT events/sec: 267337.5
WILDCARD events/sec: 200629.0
PREFIX events/sec: 309691.9
SUFFIX events/sec: 296339.4
EQUALS_IGNORE_CASE events/sec: 262399.0
NUMERIC events/sec: 3231.7
ANYTHING-BUT events/sec: 151112.1
COMBO events/sec: 3261.6

full output from benchmark test

Reading citylots2
Read 213068 events
EXACT events/sec: 255783.9
WILDCARD events/sec: 201960.2
PREFIX events/sec: 296339.4
SUFFIX events/sec: 303948.6
EQUALS_IGNORE_CASE events/sec: 261112.7
NUMERIC events/sec: 3397.9
ANYTHING-BUT events/sec: 145141.7
COMBO events/sec: 3416.4
Reading citylots2
Read 213068 events
Finding Rules...
Lots: 10000
Lots: 20000
Lots: 30000
Lots: 40000
Lots: 50000
Lots: 60000
Lots: 70000
Lots: 80000
Lots: 90000
Lots: 100000
Lots: 110000
Lots: 120000
Lots: 130000
Lots: 140000
Lots: 150000
Lots: 160000
Lots: 170000
Lots: 180000
Lots: 190000
Lots: 200000
Lots: 210000
Lines: 213068, Msec: 10391
Events/sec: 20505.1
 Rules/sec: 143535.4
Before: 203.9
After: 3035.8
Per rule: -7079
Turning JSON into field-lists...
Finding Rules...
Lines: 213068, Msec: 2078
Events/sec: 102535.1
Before: 216.3
After: 1755.7
Per rule: -3848
Reading lines...
Finding Rules...
Lots: 10000
Lots: 20000
Lots: 30000
Lots: 40000
Lots: 50000
Lots: 60000
Lots: 70000
Lots: 80000
Lots: 90000
Lots: 100000
Lots: 110000
Lots: 120000
Lots: 130000
Lots: 140000
Lots: 150000
Lots: 160000
Lots: 170000
Lots: 180000
Lots: 190000
Lots: 200000
Lots: 210000
Lines: 213068, Msec: 1097
Events/sec: 194227.9
 Rules/sec: 707377990.9
Reading citylots2
Read 213068 events
Lots: 10000
Lots: 20000
Lots: 30000
Lots: 40000
Lots: 50000
Lots: 60000
Lots: 70000
Lots: 80000
Lots: 90000
Lots: 100000
Lots: 110000
Lots: 120000
Lots: 130000
Lots: 140000
Lots: 150000
Lots: 160000
Lots: 170000
Lots: 180000
Lots: 190000
Lots: 200000
Lots: 210000
Matched: 52527
Lines: 213068, Msec: 15065
Events/sec: 14143.2
Reading lines...
Finding Rules...
Lots: 10000
Lots: 20000
Lots: 30000
Lots: 40000
Lots: 50000
Lots: 60000
Lots: 70000
Lots: 80000
Lots: 90000
Lots: 100000
Lots: 110000
Lots: 120000
Lots: 130000
Lots: 140000
Lots: 150000
Lots: 160000
Lots: 170000
Lots: 180000
Lots: 190000
Lots: 200000
Lots: 210000
Lines: 213068, Msec: 9763
Events/sec: 21824.0
 Rules/sec: 152768.2

By submitting this pull request, I confirm that my contribution is made under the terms of the Apache 2.0 license.

@timbray
Copy link
Collaborator

timbray commented Sep 7, 2022

This looks good in principle, but I've learned that it's important to not rely too much on single benchmark runs, they can be affected by lots of different environmental factors. Also, it seems to me that this should really only affect the NUMERIC output from the benchmark. (Other people… is that correct?). Looks like the NUMERIC value went from 3242.6 to 3231.7, actually slower by a small amount?

@rudygt
Copy link
Contributor Author

rudygt commented Sep 7, 2022

I agree that is very hard to draw conclutions from the test runs, too many moving pieces on local machines to keep it consistent.

I did isolated the numeric test from the benchmark and captured a couple of traces with the async profiler

this is the before, we can see the generate method relative usage to its caller
image

compared with the after
image

but definitly we need some input from someone more familiar with the benchmarks and their meanings so we can get a more informed opinion about this change.

@baldawar
Copy link
Collaborator

baldawar commented Sep 7, 2022

Let me try to run the benchmarks for this commit and share the results here.

@baldawar
Copy link
Collaborator

baldawar commented Sep 8, 2022

I've tried on multiple different hardware and found performance to be hit or miss. It's kinda surprising but this was the only run that showed better results for NUMERIC (but other matchers performed worse).

Before

Reading citylots2
Read 213068 events
EXACT events/sec: 161660.1
WILDCARD events/sec: 158532.7
PREFIX events/sec: 216973.5
SUFFIX events/sec: 174789.2
EQUALS_IGNORE_CASE events/sec: 111846.7
NUMERIC events/sec: 1499.0
ANYTHING-BUT events/sec: 104240.7
COMBO events/sec: 1406.6
Reading citylots2
Read 213068 events
Finding Rules...
Lots: 10000
Lots: 20000
Lots: 30000
Lots: 40000
Lots: 50000
Lots: 60000
Lots: 70000
Lots: 80000
Lots: 90000
Lots: 100000
Lots: 110000
Lots: 120000
Lots: 130000
Lots: 140000
Lots: 150000
Lots: 160000
Lots: 170000
Lots: 180000
Lots: 190000
Lots: 200000
Lots: 210000
Lines: 213068, Msec: 14314
Events/sec: 14885.3
 Rules/sec: 104197.0
Before: 202.2
After: 1555.6
Per rule: -3383
Turning JSON into field-lists...
Finding Rules...
Lines: 213068, Msec: 2980
Events/sec: 71499.3
Before: 223.0
After: 1460.4
Per rule: -3093
Reading lines...
Finding Rules...
Lots: 10000
Lots: 20000
Lots: 30000
Lots: 40000
Lots: 50000
Lots: 60000
Lots: 70000
Lots: 80000
Lots: 90000
Lots: 100000
Lots: 110000
Lots: 120000
Lots: 130000
Lots: 140000
Lots: 150000
Lots: 160000
Lots: 170000
Lots: 180000
Lots: 190000
Lots: 200000
Lots: 210000
Lines: 213068, Msec: 1458
Events/sec: 146137.2
 Rules/sec: 532231588.5
Reading citylots2
Read 213068 events
Lots: 10000
Lots: 20000
Lots: 30000
Lots: 40000
Lots: 50000
Lots: 60000
Lots: 70000
Lots: 80000
Lots: 90000
Lots: 100000
Lots: 110000
Lots: 120000
Lots: 130000
Lots: 140000
Lots: 150000
Lots: 160000
Lots: 170000
Lots: 180000
Lots: 190000
Lots: 200000
Lots: 210000
Matched: 52527
Lines: 213068, Msec: 27899
Events/sec: 7637.1
Reading lines...
Finding Rules...
Lots: 10000
Lots: 20000
Lots: 30000
Lots: 40000
Lots: 50000
Lots: 60000
Lots: 70000
Lots: 80000
Lots: 90000
Lots: 100000
Lots: 110000
Lots: 120000
Lots: 130000
Lots: 140000
Lots: 150000
Lots: 160000
Lots: 170000
Lots: 180000
Lots: 190000
Lots: 200000
Lots: 210000
Lines: 213068, Msec: 13278
Events/sec: 16046.7
 Rules/sec: 112326.9

Process finished with exit code 0

After the change

Reading citylots2
Read 213068 events
EXACT events/sec: 201007.5
WILDCARD events/sec: 144550.9
PREFIX events/sec: 215655.9
SUFFIX events/sec: 227636.8
EQUALS_IGNORE_CASE events/sec: 186085.6
NUMERIC events/sec: 1511.7
ANYTHING-BUT events/sec: 92598.0
COMBO events/sec: 1601.3
Reading citylots2
Read 213068 events
Finding Rules...
Lots: 10000
Lots: 20000
Lots: 30000
Lots: 40000
Lots: 50000
Lots: 60000
Lots: 70000
Lots: 80000
Lots: 90000
Lots: 100000
Lots: 110000
Lots: 120000
Lots: 130000
Lots: 140000
Lots: 150000
Lots: 160000
Lots: 170000
Lots: 180000
Lots: 190000
Lots: 200000
Lots: 210000
Lines: 213068, Msec: 15464
Events/sec: 13778.3
 Rules/sec: 96448.3
Before: 189.7
After: 1880.7
Per rule: -4227
Turning JSON into field-lists...
Finding Rules...
Lines: 213068, Msec: 2912
Events/sec: 73169.0
Before: 229.3
After: 1754.0
Per rule: -3811
Reading lines...
Finding Rules...
Lots: 10000
Lots: 20000
Lots: 30000
Lots: 40000
Lots: 50000
Lots: 60000
Lots: 70000
Lots: 80000
Lots: 90000
Lots: 100000
Lots: 110000
Lots: 120000
Lots: 130000
Lots: 140000
Lots: 150000
Lots: 160000
Lots: 170000
Lots: 180000
Lots: 190000
Lots: 200000
Lots: 210000
Lines: 213068, Msec: 1719
Events/sec: 123948.8
 Rules/sec: 451421556.7
Reading citylots2
Read 213068 events
Lots: 10000
Lots: 20000
Lots: 30000
Lots: 40000
Lots: 50000
Lots: 60000
Lots: 70000
Lots: 80000
Lots: 90000
Lots: 100000
Lots: 110000
Lots: 120000
Lots: 130000
Lots: 140000
Lots: 150000
Lots: 160000
Lots: 170000
Lots: 180000
Lots: 190000
Lots: 200000
Lots: 210000
Matched: 52527
Lines: 213068, Msec: 29947
Events/sec: 7114.8
Reading lines...
Finding Rules...
Lots: 10000
Lots: 20000
Lots: 30000
Lots: 40000
Lots: 50000
Lots: 60000
Lots: 70000
Lots: 80000
Lots: 90000
Lots: 100000
Lots: 110000
Lots: 120000
Lots: 130000
Lots: 140000
Lots: 150000
Lots: 160000
Lots: 170000
Lots: 180000
Lots: 190000
Lots: 200000
Lots: 210000
Lines: 213068, Msec: 13681
Events/sec: 15574.0
 Rules/sec: 109018.1

@timbray
Copy link
Collaborator

timbray commented Sep 8, 2022

I don't think we have enough evidence to convince us that this particular change will meaningfully improve things. But @rudygt, you're looking in exactly the right area. The round-tripping between JSON numbers and double and back through String.format("%014x", … is definitely burning a lot of cycles. I think we'd welcome anything, even if it's hacky, that would speed up this code path. Also BTW Quamina has exactly he same problem.

@baldawar
Copy link
Collaborator

baldawar commented Sep 8, 2022

I'd agree. This is worth digging more into.

I ran a scrappy benchmark outside of the current test setup and found the hex string change proposed here to perform better. Might be helpful to see if Quamina does better or worse. It might show if there's an issue within ruler's benchmarks, or if there's an edge case that show up really well with citylots dataset.

Test

    @Test
    public void benchmarkStrFormatVsHex() {
        Random rand = new Random();
        final double[] seeds = rand
                .doubles(10_000_000, -Constants.FIVE_BILLION, Constants.FIVE_BILLION)
                .toArray();

        // check that there's no bug when converting (also maybe triggers any memory optimizations)
        for(Double seed : seeds) {
            final String left = usesHexString(seed);
            final String right = usesStrFormat(seed);
            assertEquals(left, right);
        }

        // check for time in millis when converting all seed numbers to hex via proposed change
        final Instant instant1 = Instant.now();
        for(Double seed : seeds) {
            usesHexString(seed);
        }
        final Instant instant2 = Instant.now();
        System.out.println("usesHexString exec time (ms) " + Duration.between(instant1, instant2).toMillis());

        // check for time in millis when converting all seed numbers based on String.format
        final Instant instant3 = Instant.now();
        for(Double seed : seeds) {
            usesStrFormat(seed);
        }
        final Instant instant4 = Instant.now();
        System.out.println("usesStrFormat exec time (ms) " + Duration.between(instant3, instant4).toMillis());
    }

    private static final double TEN_E_SIX = 1E6;

    public static String usesStrFormat(double f) {
        return String.format("%014x", (long) (TEN_E_SIX * (Constants.FIVE_BILLION + f))).toUpperCase(Locale.ROOT);
    }

    public static String usesHexString(double f) {
        return leftPad(Long.toHexString((long) (TEN_E_SIX * (Constants.FIVE_BILLION + f))).toUpperCase(Locale.ROOT));
    }

    private static String leftPad(String input){
        return input.length() < 14 ? "00000000000000".substring(input.length()) + input : input;
    }

Output

usesHexString exec time (ms) 1120
usesStrFormat exec time (ms) 6252

@rudygt
Copy link
Contributor Author

rudygt commented Sep 8, 2022

handy test you got there @baldawar

I checked again today and found that the upperCase was also burning some cicles, and we know we are uppercasing hex digits so only "a-f", I found that if we go directly to hex with upper case chars we can get a clearer perf improvement. as we also know we want 14 chars we can just skip the first byte and get the fixed size string avoiding the left pad thing altogheter.

I ran this test multiple times and the improvement factor range from 19-27 so at least it is consistently above

pd: thanks to you both for taking the time to look into this

Test

    @Test
    public void benchmarkStrFormatVsHex() {
        Random rand = new Random();
        final double[] seeds = rand
                .doubles(10_000_000, -Constants.FIVE_BILLION, Constants.FIVE_BILLION)
                .toArray();

        // check that there's no bug when converting (also maybe triggers any memory optimizations)
        for (Double seed : seeds) {
            final String left = usesHexString(seed);
            final String right = usesStrFormat(seed);
            assertEquals(left, right);
        }

        // check for time in millis when converting all seed numbers to hex via proposed change
        final Instant instant1 = Instant.now();
        for (Double seed : seeds) {
            usesHexString(seed);
        }
        final Instant instant2 = Instant.now();
        long d1 = Duration.between(instant1, instant2).toMillis();
        System.out.println("usesHexString exec time (ms) " + d1);

        // check for time in millis when converting all seed numbers based on String.format
        final Instant instant3 = Instant.now();
        for (Double seed : seeds) {
            usesStrFormat(seed);
        }
        final Instant instant4 = Instant.now();
        long d2 = Duration.between(instant3, instant4).toMillis();
        System.out.println("usesStrFormat exec time (ms) " + d2);
        System.out.println("improvement factor (times) " + (d2 / d1));
    }

    private static final double TEN_E_SIX = 1E6;

    public static String usesStrFormat(double f) {
        return String.format("%014x", (long) (TEN_E_SIX * (Constants.FIVE_BILLION + f))).toUpperCase(Locale.ROOT);
    }

    public static String usesHexString(double f) {
        return toHexStringSkippingFirstByte((long) (TEN_E_SIX * (Constants.FIVE_BILLION + f)));
    }

    private static final String HEXES = "0123456789ABCDEF";

    private static byte[] longToByteBuffer(long value) {
        ByteBuffer buffer = ByteBuffer.allocate(Long.BYTES);
        buffer.putLong(value);
        return buffer.array();
    }

    static String toHexStringSkippingFirstByte(Long value) {
        byte[] raw = longToByteBuffer(value);
        char[] chars = new char[14];
        for (int i = 1; i < raw.length; i++) {
            byte b = raw[i];
            int pos = (i - 1) * 2;
            chars[pos] = HEXES.charAt((b & 0xF0) >> 4);
            chars[pos + 1] = HEXES.charAt((b & 0x0F));
        }
        return new String(chars);
    }

Output

//  10 million doubles
usesHexString exec time (ms) 161
usesStrFormat exec time (ms) 3989
improvement factor (times) 24

// 100 million doubles
usesHexString exec time (ms) 1593
usesStrFormat exec time (ms) 39990
improvement factor (times) 25

@timbray
Copy link
Collaborator

timbray commented Sep 8, 2022

Um, are we sure that the lexical ordering of Long.toHexString() is the same as that of the underlying 64-bit unsigned int? I think that works because we force all the values to be positive…

I don't think there's any reason we need the hex to be upper case, a-f is fine, no?

@rudygt
Copy link
Contributor Author

rudygt commented Sep 8, 2022

@timbray Long.toHexString() is gone in the current version of the pull

about the ordering as far as I remember java is big endian and this is platform independent so we should be good (also in the test we are bouncing around we are comparing values just to make sure the candidate is producing exactly the same ouput as the original version).

Copy link
Collaborator

@timbray timbray left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This basically LGTM. I'm assuming all the unit tests pass, which is kind of amazing after having switched from decimal to hex digits, especially considering things like the logic around https://github.com/aws/event-ruler/blob/main/src/main/software/amazon/event/ruler/ByteMachine.java#L1021

I'm going to leave approval to Rishi or Shawn, because I don't have time to validate all the tests and so on right now.

@timbray
Copy link
Collaborator

timbray commented Sep 8, 2022

Oh, and I didn't say, thanks so much @rudygt!

@rudygt
Copy link
Contributor Author

rudygt commented Sep 8, 2022

This basically LGTM. I'm assuming all the unit tests pass, which is kind of amazing after having switched from decimal to hex digits, especially considering things like the logic around https://github.com/aws/event-ruler/blob/main/src/main/software/amazon/event/ruler/ByteMachine.java#L1021

I'm going to leave approval to Rishi or Shawn, because I don't have time to validate all the tests and so on right now.

I think this explains why there is uppercase in the method we are improving

https://github.com/aws/event-ruler/blob/main/src/main/software/amazon/event/ruler/Constants.java#L40

so looks like the comment dont reflect the fact that it works with hex digits now

@baldawar
Copy link
Collaborator

baldawar commented Sep 9, 2022

LGTM as well. @rudygt can you share the benchmark results (before and after) after the new change? Just want to make sure we there's nothing odd when running against the test dataset.

Comment on lines 59 to 62
int pos = (i - 1) * 2;
chars[pos] = HEXES.charAt((b & 0xF0) >> 4);
chars[pos + 1] = HEXES.charAt((b & 0x0F));
}
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

not a blocker but would prefer to have documentation around these two lines. Not all engineers get what's happening.

return toHexStringSkippingFirstByte((long) (TEN_E_SIX * (Constants.FIVE_BILLION + f)));
}

private static final String HEXES = "0123456789ABCDEF";
Copy link
Collaborator

@baldawar baldawar Sep 9, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

not a big deal but would love to have this tied to Constants.HEX_DIGITS to avoid one going out to sync with the other (in case we do some refactoring in future)

@baldawar
Copy link
Collaborator

baldawar commented Sep 9, 2022

really neat trick, btw! looking forward to merging it soon

@rudygt
Copy link
Contributor Author

rudygt commented Sep 9, 2022

Thanks Rishi,

I have incorporated your feedback to make it easier to read and tie the hex chars to constants.

Before

Reading citylots2
Read 213068 events
EXACT events/sec: 252749.7
WILDCARD events/sec: 189393.8
PREFIX events/sec: 289888.4
SUFFIX events/sec: 284090.7
EQUALS_IGNORE_CASE events/sec: 248041.9
NUMERIC events/sec: 3233.3
ANYTHING-BUT events/sec: 143867.7
COMBO events/sec: 3225.2
Reading citylots2
Read 213068 events
Finding Rules...
Lots: 10000
Lots: 20000
Lots: 30000
Lots: 40000
Lots: 50000
Lots: 60000
Lots: 70000
Lots: 80000
Lots: 90000
Lots: 100000
Lots: 110000
Lots: 120000
Lots: 130000
Lots: 140000
Lots: 150000
Lots: 160000
Lots: 170000
Lots: 180000
Lots: 190000
Lots: 200000
Lots: 210000
Lines: 213068, Msec: 10798
Events/sec: 19732.2
 Rules/sec: 138125.2
Before: 203.9
After: 3035.7
Per rule: -7079
Turning JSON into field-lists...
Finding Rules...
Lines: 213068, Msec: 1939
Events/sec: 109885.5
Before: 216.3
After: 1741.0
Per rule: -3811
Reading lines...
Finding Rules...
Lots: 10000
Lots: 20000
Lots: 30000
Lots: 40000
Lots: 50000
Lots: 60000
Lots: 70000
Lots: 80000
Lots: 90000
Lots: 100000
Lots: 110000
Lots: 120000
Lots: 130000
Lots: 140000
Lots: 150000
Lots: 160000
Lots: 170000
Lots: 180000
Lots: 190000
Lots: 200000
Lots: 210000
Lines: 213068, Msec: 1047
Events/sec: 203503.3
 Rules/sec: 741159174.8
Reading citylots2
Read 213068 events
Lots: 10000
Lots: 20000
Lots: 30000
Lots: 40000
Lots: 50000
Lots: 60000
Lots: 70000
Lots: 80000
Lots: 90000
Lots: 100000
Lots: 110000
Lots: 120000
Lots: 130000
Lots: 140000
Lots: 150000
Lots: 160000
Lots: 170000
Lots: 180000
Lots: 190000
Lots: 200000
Lots: 210000
Matched: 52527
Lines: 213068, Msec: 16095
Events/sec: 13238.1
Reading lines...
Finding Rules...
Lots: 10000
Lots: 20000
Lots: 30000
Lots: 40000
Lots: 50000
Lots: 60000
Lots: 70000
Lots: 80000
Lots: 90000
Lots: 100000
Lots: 110000
Lots: 120000
Lots: 130000
Lots: 140000
Lots: 150000
Lots: 160000
Lots: 170000
Lots: 180000
Lots: 190000
Lots: 200000
Lots: 210000
Lines: 213068, Msec: 9767
Events/sec: 21815.1
 Rules/sec: 152705.6

After

Reading citylots2
Read 213068 events
EXACT events/sec: 262076.3
WILDCARD events/sec: 197651.2
PREFIX events/sec: 296339.4
SUFFIX events/sec: 296339.4
EQUALS_IGNORE_CASE events/sec: 257328.5
NUMERIC events/sec: 3374.8
ANYTHING-BUT events/sec: 145737.3
COMBO events/sec: 3389.3
Reading citylots2
Read 213068 events
Finding Rules...
Lots: 10000
Lots: 20000
Lots: 30000
Lots: 40000
Lots: 50000
Lots: 60000
Lots: 70000
Lots: 80000
Lots: 90000
Lots: 100000
Lots: 110000
Lots: 120000
Lots: 130000
Lots: 140000
Lots: 150000
Lots: 160000
Lots: 170000
Lots: 180000
Lots: 190000
Lots: 200000
Lots: 210000
Lines: 213068, Msec: 10580
Events/sec: 20138.8
 Rules/sec: 140971.3
Before: 191.3
After: 3029.5
Per rule: -7095
Turning JSON into field-lists...
Finding Rules...
Lines: 213068, Msec: 1922
Events/sec: 110857.4
Before: 216.3
After: 1749.4
Per rule: -3832
Reading lines...
Finding Rules...
Lots: 10000
Lots: 20000
Lots: 30000
Lots: 40000
Lots: 50000
Lots: 60000
Lots: 70000
Lots: 80000
Lots: 90000
Lots: 100000
Lots: 110000
Lots: 120000
Lots: 130000
Lots: 140000
Lots: 150000
Lots: 160000
Lots: 170000
Lots: 180000
Lots: 190000
Lots: 200000
Lots: 210000
Lines: 213068, Msec: 1031
Events/sec: 206661.5
 Rules/sec: 752661160.0
Reading citylots2
Read 213068 events
Lots: 10000
Lots: 20000
Lots: 30000
Lots: 40000
Lots: 50000
Lots: 60000
Lots: 70000
Lots: 80000
Lots: 90000
Lots: 100000
Lots: 110000
Lots: 120000
Lots: 130000
Lots: 140000
Lots: 150000
Lots: 160000
Lots: 170000
Lots: 180000
Lots: 190000
Lots: 200000
Lots: 210000
Matched: 52527
Lines: 213068, Msec: 15054
Events/sec: 14153.6
Reading lines...
Finding Rules...
Lots: 10000
Lots: 20000
Lots: 30000
Lots: 40000
Lots: 50000
Lots: 60000
Lots: 70000
Lots: 80000
Lots: 90000
Lots: 100000
Lots: 110000
Lots: 120000
Lots: 130000
Lots: 140000
Lots: 150000
Lots: 160000
Lots: 170000
Lots: 180000
Lots: 190000
Lots: 200000
Lots: 210000
Lines: 213068, Msec: 9578
Events/sec: 22245.6
 Rules/sec: 155718.9

Copy link
Collaborator

@baldawar baldawar left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you making this better. ❤️

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

3 participants