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

Multi Thread Serialize/Deserialize benchmark issue 多线程下序列化性能异常 #1630

Open
1 of 2 tasks
j9kkk opened this issue May 14, 2024 · 0 comments
Open
1 of 2 tasks
Labels
bug Something isn't working

Comments

@j9kkk
Copy link

j9kkk commented May 14, 2024

Search before asking

  • I had searched in the issues and found no similar issues.

Version

os:windows 10
java: 1.8.0_271
fury:
org.apache.fury
fury-core
0.5.0

Component(s)

Java

Minimal reproduce step

private void benchmark(BaseFury fury) {
    long start = System.nanoTime();
    for (int i = 0; i < COUNT; i++) {
        User user = new User("John", "Doe", 30);
        byte[] serialize = fury.serialize(user);
        Object deserialize = fury.deserialize(serialize);
    }
    long end = System.nanoTime();
    long elapsed = end - start;
    log.info("Elapsed time: {} ns, tps= {} /s", elapsed, String.format("%.2f", COUNT / (elapsed / 1e9)));
}

@Test
public void testFury() {
    Fury fury = Fury.builder().withLanguage(Language.JAVA)
            // Allow to deserialize objects unknown types, more flexible
            // but may be insecure if the classes contains malicious code.
            .requireClassRegistration(true)
            .build();
    // Registering types can reduce class name serialization overhead, but not mandatory.
    // If class registration enabled, all custom types must be registered.
    fury.register(TestFury.class);
    fury.register(User.class);

    benchmark(fury);
}

@Test
public void testMultiFury() throws InterruptedException {
    ThreadSafeFury fury = Fury.builder().withLanguage(Language.JAVA)
            // Allow to deserialize objects unknown types, more flexible
            // but may be insecure if the classes contains malicious code.
            .requireClassRegistration(true)
            .buildThreadSafeFury();
    fury.register(TestFury.class);
    fury.register(User.class);

    int threads = Runtime.getRuntime().availableProcessors();
    for (int i = 0; i < threads; i++) {
        new Thread(() -> {
            benchmark(fury);
        }).start();
    }

    Thread.currentThread().join();
}
class User {
    private String firstName;
    private String lastName;
    private int age;

    public User(String john, String doe, int i) {
        this.firstName = john;
        this.lastName = doe;
        this.age = i;
    }

What did you expect to see?

单线程与多线程序列化反序列化性能一致

What did you see instead?

单线程Fury Benchmark

2024-05-14 12:38:36 INFO  Fury:144 [main] - Created new fury org.apache.fury.Fury@29626d54
2024-05-14 12:38:36 INFO  CompileUnit:55 [main] - Generate code for com.example.test.UserFuryCodec_1_414493378_1516500233 took 71 ms.
2024-05-14 12:38:36 INFO  JaninoUtils:121 [main] - Compile [UserFuryCodec_1_414493378_1516500233] take 265 ms
24/05/14 12:38:58.959 [INFO ] 23 com.example.test.TestFury[23] - Elapsed time: 22694408600 ns, tps= 4406371.71 /s 

多线程ThreadSafeFury Benchmark

2024-05-14 12:38:58 INFO  Fury:144 [main] - Created new fury org.apache.fury.Fury@624ea235
2024-05-14 12:38:58 INFO  Fury:144 [Thread-3] - Created new fury org.apache.fury.Fury@4ff7ff2e
2024-05-14 12:38:58 INFO  Fury:144 [Thread-2] - Created new fury org.apache.fury.Fury@60bfb620
2024-05-14 12:38:58 INFO  Fury:144 [Thread-6] - Created new fury org.apache.fury.Fury@7ff887
2024-05-14 12:38:58 INFO  Fury:144 [Thread-4] - Created new fury org.apache.fury.Fury@44de8d4a
2024-05-14 12:38:58 INFO  Fury:144 [Thread-5] - Created new fury org.apache.fury.Fury@159886f2
2024-05-14 12:38:58 INFO  Fury:144 [Thread-7] - Created new fury org.apache.fury.Fury@1d5fc898
2024-05-14 12:38:58 INFO  Fury:144 [Thread-1] - Created new fury org.apache.fury.Fury@47540be1
2024-05-14 12:38:58 INFO  Fury:144 [Thread-8] - Created new fury org.apache.fury.Fury@69b38d00
24/05/14 12:39:28.896 [INFO ] 23 com.example.test.TestFury[23] - Elapsed time: 29918667800 ns, tps= 3342394.81 /s 
24/05/14 12:39:30.318 [INFO ] 23 com.example.test.TestFury[23] - Elapsed time: 31341023100 ns, tps= 3190706.30 /s 
24/05/14 12:39:33.827 [INFO ] 23 com.example.test.TestFury[23] - Elapsed time: 34851435100 ns, tps= 2869322.30 /s 
24/05/14 12:39:34.476 [INFO ] 23 com.example.test.TestFury[23] - Elapsed time: 35503676500 ns, tps= 2816609.71 /s 
24/05/14 12:39:35.605 [INFO ] 23 com.example.test.TestFury[23] - Elapsed time: 36628779700 ns, tps= 2730093.68 /s 
24/05/14 12:39:36.613 [INFO ] 23 com.example.test.TestFury[23] - Elapsed time: 37636506500 ns, tps= 2656994.75 /s 
24/05/14 12:39:36.622 [INFO ] 23 com.example.test.TestFury[23] - Elapsed time: 37644876100 ns, tps= 2656404.01 /s 
24/05/14 12:39:36.769 [INFO ] 23 com.example.test.TestFury[23] - Elapsed time: 37792022400 ns, tps= 2646061.09 /s 

问题

  1. 多线程tps约为单线程tps一半
  2. 多线程之间tps结果差异较大

Anything Else?

No response

Are you willing to submit a PR?

  • I'm willing to submit a PR!
@j9kkk j9kkk added the bug Something isn't working label May 14, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

1 participant