On 4/19/20 10:29 PM, Ranier Vilela wrote:
Em dom., 19 de abr. de 2020 às 16:33, Tomas Vondra <tomas.von...@2ndquadrant.com <mailto:tomas.von...@2ndquadrant.com>> escreveu:

    On Sun, Apr 19, 2020 at 11:24:38AM -0300, Ranier Vilela wrote:
     >Hi,
     >strlen it is one of the low fruits that can be harvested.
     >What is your opinion?
     >

    That assumes this actually affects/improves performance, without any
    measurements proving that. Considering large number of the places you
    modified are related to DDL (CreateComment, ChooseIndexColumnNames, ...)
    or stuff that runs only once or infrequently (like the changes in
    PostmasterMain or libpqrcv_get_senderinfo). Likewise, it seems entirely
    pointless to worry about strlen() overhead e.g. in fsync_parent_path
    which is probably dominated by I/O.

With code as interconnected as postgres, it is difficult to say that a function, which calls strlen, repeatedly, would not have any gain. Regarding the functions, I was just being consistent, trying to remove all occurrences, even where, there is very little gain.

At least gcc 9.3 optimizes "strlen(s) == 0" to "s[0] == '\0'", even at low optimization levels. I tried it out with https://godbolt.org/.

Maybe some of the others cases are performance improvements, I have not checked your patch in details, but strlen() == 0 is easily handled by the compiler.

C code:

int f1(char *str) {
    return strlen(str) == 0;
}

int f2(char *str) {
    return str[0] == '\0';
}

Assembly generated with default flags:

f1:
        pushq   %rbp
        movq    %rsp, %rbp
        movq    %rdi, -8(%rbp)
        movq    -8(%rbp), %rax
        movzbl  (%rax), %eax
        testb   %al, %al
        sete    %al
        movzbl  %al, %eax
        popq    %rbp
        ret
f2:
        pushq   %rbp
        movq    %rsp, %rbp
        movq    %rdi, -8(%rbp)
        movq    -8(%rbp), %rax
        movzbl  (%rax), %eax
        testb   %al, %al
        sete    %al
        movzbl  %al, %eax
        popq    %rbp
        ret

Assembly generated with -O2.

f1:
        xorl    %eax, %eax
        cmpb    $0, (%rdi)
        sete    %al
        ret
f2:
        xorl    %eax, %eax
        cmpb    $0, (%rdi)
        sete    %al
        ret

Andreas


Reply via email to