How to replace /(division) operator

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • spl

    How to replace /(division) operator

    To increase the performance, how to change the / operator with bitwise
    operators?
    for ex: 25/5, 225/25 or 25/3 or any division, but I am not bothered
    of any remainder.
  • jacob navia

    #2
    Re: How to replace /(division) operator

    spl wrote:
    To increase the performance, how to change the / operator with bitwise
    operators?
    for ex: 25/5, 225/25 or 25/3 or any division, but I am not bothered
    of any remainder.
    This is not meaningful if you do not say which CPU
    are you using. Division is not that expensive anymore,
    and the extra code for implementing division with bitwise
    operators could very well be MUCH slower.

    The lcc-win compiler will replace certain kinds of division ( divisions
    by an integer constant) with 3-4 instructions with shifts and adds. This
    is only possible when the divisor is known at compile time.



    --
    jacob navia
    jacob at jacob point remcomp point fr
    logiciels/informatique

    Comment

    • Eric Sosman

      #3
      Re: How to replace /(division) operator

      spl wrote:
      To increase the performance, how to change the / operator with bitwise
      operators?
      for ex: 25/5, 225/25 or 25/3 or any division, but I am not bothered
      of any remainder.
      How bad is "the performance" right now? Do you have
      evidence that integer divisions are the reason it's bad?

      If you do have such evidence, it's probable that the
      compiler for a slow-dividing machine already employs lots
      of tricks to replace slow divisions with faster alternatives.
      If the denominator is a compile-time constant, the compiler
      for such a machine will quite likely use all kinds of dodges
      to avoid a slow divide. (If both the numerator and denominator
      are compile-time constants, it's quite UNlikely that there
      will be any divisions at run-time.)

      Pretty much the only case where you'll be able to do
      better than the compiler is where the division is x/y with
      y a run-time variable and where you know things about the
      ranges of x and y that the compiler doesn't. In this case
      the compiler may generate a fully-general division that
      you might be able to replace with something less general but
      faster. You'll need to study this on the machine(s) of
      interest, because the trade-offs will be different from one
      computer to the next.

      Finally, as with pretty much anything else: The fastest
      division is the one you don't perform at all. If your program
      is bogged down in a multitude of divisions, consider ways to
      rearrange the calculation so fewer divisions are needed in
      the first place.

      --
      Eric Sosman
      esosman@ieee-dot-org.invalid

      Comment

      • spl

        #4
        Re: How to replace /(division) operator

        I use normal Microsoft visual C++ compiler only. Due to lots of more
        frequency in accessing / operator, I feel to change it with bitwise
        operator, as it is always faster then / operator. So, If you know
        bitwise manipulation, please suggest me!!

        Comment

        • Chris Dollin

          #5
          Re: How to replace /(division) operator

          spl wrote:
          I use normal Microsoft visual C++ compiler only. Due to lots of more
          frequency in accessing / operator, I feel to change it with bitwise
          operator, as it is always faster then / operator.
          Does your application have an actual, measured, performance problem
          that you've tracked down to your use of `/`?

          Sure, individual bitwise operations are often faster than individual
          `/` operations. That's because they do simpler -- different -- things.
          To replace your `/`s with bitwise ops, you'll have to do /multiple/,
          /dependent/ bitwise ops, so it's not longer obvious that this is
          faster.

          --
          "Your world, Colonel, and I wish you the best of it!" /Witch World/

          Hewlett-Packard Limited registered office: Cain Road, Bracknell,
          registered no: 690597 England Berks RG12 1HN

          Comment

          • spl

            #6
            Re: How to replace /(division) operator

            On Apr 25, 2:03 pm, Chris Dollin <chris.dol...@h p.comwrote:
            spl wrote:
            I use normal Microsoft visual C++ compiler only. Due to lots of more
            frequency in accessing / operator, I feel to change it with bitwise
            operator, as it is always faster then / operator.
            >
            Does your application have an actual, measured, performance problem
            that you've tracked down to your use of `/`?
            YES. I have.

            Comment

            • Bartc

              #7
              Re: How to replace /(division) operator


              "spl" <splender.dev@g mail.comwrote in message
              news:e1ce6bf0-d4b5-4fa0-a647-e15e0caeca7b@m4 4g2000hsc.googl egroups.com...
              >I use normal Microsoft visual C++ compiler only. Due to lots of more
              frequency in accessing / operator, I feel to change it with bitwise
              operator, as it is always faster then / operator. So, If you know
              bitwise manipulation, please suggest me!!
              Do you know what sort of numbers are being operated on?

              Are the numbers you divide by, constants? If not things are more difficult.

              Dividing by a power of 2 can sometimes be replaced by a shift, if you know
              the number. (If not, but is a power of 2, you can keep track of the shift
              count needed.) However, if it's something obvious, the compiler will already
              have done it!

              How much runtime is given over to division anyway? On what processor (as
              they are all different)?

              Can you post some test code that demonstrates the problem you have?

              Sometimes you can rearrange the code to reduce or eliminate division.

              --
              Bart


              Comment

              • Eric Sosman

                #8
                Re: How to replace /(division) operator

                spl wrote:
                I use normal Microsoft visual C++ compiler only. Due to lots of more
                frequency in accessing / operator, I feel to change it with bitwise
                operator, as it is always faster then / operator. So, If you know
                bitwise manipulation, please suggest me!!
                I'll repeat my earlier question for the hard of hearing:
                HOW BAD IS "THE PERFORMANCE" RIGHT NOW? DO YOU HAVE
                EVIDENCE THAT INTEGER DIVISIONS ARE THE REASON IT'S BAD?
                Unless and until you have answers for these questions, you
                are simply wasting your time. (Thought experiment: How much
                time have you already spent writing your question and reading
                the responses, and how many "slow" divisions could your
                computer have performed in that amount of time?)

                --
                Eric.Sosman@sun .com

                Comment

                • Chris Dollin

                  #9
                  Re: How to replace /(division) operator

                  spl wrote:
                  On Apr 25, 2:03 pm, Chris Dollin <chris.dol...@h p.comwrote:
                  >spl wrote:
                  I use normal Microsoft visual C++ compiler only. Due to lots of more
                  frequency in accessing / operator, I feel to change it with bitwise
                  operator, as it is always faster then / operator.
                  >>
                  >Does your application have an actual, measured, performance problem
                  >that you've tracked down to your use of `/`?
                  >
                  YES. I have.
                  Then you can tell us the numbers and the context and the code
                  that is slow, and get advice suited to your actual problem
                  rather than speculation into the vacuum.

                  (And note that you'll get /C/ advice; if you have a C++ program,
                  it's possible that there will be better C++-oriented answers
                  in A Different Group.)

                  --
                  "It was the first really clever thing the King had /Alice in Wonderland/
                  said that day."

                  Hewlett-Packard Limited registered office: Cain Road, Bracknell,
                  registered no: 690597 England Berks RG12 1HN

                  Comment

                  • Martin Ambuhl

                    #10
                    Re: How to replace /(division) operator

                    spl wrote:
                    I use normal Microsoft visual C++ compiler only. Due to lots of more
                    frequency in accessing / operator, I feel to change it with bitwise
                    operator, as it is always faster then / operator. So, If you know
                    bitwise manipulation, please suggest me!!
                    You are probably confused about what language you are using. The C
                    programing language (the one discussed in the newsgroup you posted to,
                    <news:comp.lang .c>) does not allow you to redefine the meaning of
                    operators like '/'.

                    There are other puzzling things about your post. If you actually knew
                    the "bitwise operator, as it is always faster than / operator", then you
                    would already have the implementation you want. In that case, you would
                    have no need of anyone to "please suggest me!!". And if your claim were
                    in any sense true, why would you think that the Microsoft compiler
                    developers did not already use this supposed "always faster" approach
                    for their implementation of the '/' operator?

                    I fear that you are very confused, or erroneously parroting someone
                    else, or simply a troll.

                    Comment

                    • spl

                      #11
                      Re: How to replace /(division) operator

                      Sorry for the delay in getting back to your questions, Actually
                      changing the division operator to bitwise operators is suggested by my
                      tech lead. As she done so many such improvement by doing this and she
                      is having enough evidence for the same. She suggested me to do the
                      same in my current project too. Actually I want to divide some big
                      number with constant number, say 1024 always. Please give me your
                      suggestion please.

                      Comment

                      • Bartc

                        #12
                        Re: How to replace /(division) operator


                        "spl" <splender.dev@g mail.comwrote in message
                        news:ff9f8829-852d-4ab4-b05f-a96148cd0e9d@y3 8g2000hsy.googl egroups.com...
                        Sorry for the delay in getting back to your questions, Actually
                        changing the division operator to bitwise operators is suggested by my
                        tech lead. As she done so many such improvement by doing this and she
                        is having enough evidence for the same. She suggested me to do the
                        same in my current project too. Actually I want to divide some big
                        number with constant number, say 1024 always. Please give me your
                        suggestion please.
                        My suggestion is to just divide by 1024.

                        Your compiler will use the most appropriate coding, you probably don't even
                        have to tell it to optimise.

                        Only if your compiler is so basic that you might try using (A>>10) instead
                        of A/1024, if A is an appropriate type like int, followed by a comment as to
                        why you are doing this.

                        --
                        Bartc


                        Comment

                        • Eric Sosman

                          #13
                          Re: How to replace /(division) operator

                          Bartc wrote:
                          "spl" <splender.dev@g mail.comwrote in message
                          news:ff9f8829-852d-4ab4-b05f-a96148cd0e9d@y3 8g2000hsy.googl egroups.com...
                          >Sorry for the delay in getting back to your questions, Actually
                          >changing the division operator to bitwise operators is suggested by my
                          >tech lead. As she done so many such improvement by doing this and she
                          >is having enough evidence for the same. She suggested me to do the
                          >same in my current project too. Actually I want to divide some big
                          >number with constant number, say 1024 always. Please give me your
                          >suggestion please.
                          >
                          My suggestion is to just divide by 1024.
                          >
                          Your compiler will use the most appropriate coding, you probably don't even
                          have to tell it to optimise.
                          >
                          Only if your compiler is so basic that you might try using (A>>10) instead
                          of A/1024, if A is an appropriate type like int, followed by a comment as to
                          why you are doing this.
                          Pay close attention to that "appropriat e type" part, and
                          view "like int" with caution. The problem is that the result
                          of right-shifting a negative number is implementation-defined,
                          and is usually not the same as the result of dividing by two.
                          For example, on the two's complement machines that are all
                          but universal nowadays the representation of -1 is a string
                          of 1-bits. Shift the string one place to the right and you
                          may get another string of 1-bits ("arithmetic shift") or a
                          single 0-bit followed by 1-bits ("logical shift"). The first
                          thus gives -1 again, while the second gives a large positive
                          result -- but neither gives the correct result -1 / 2 == 0.

                          So: "appropriat e type" means either an *unsigned* integer
                          or a signed integer that you happen to know is non-negative.

                          --
                          Eric Sosman
                          esosman@ieee-dot-org.invalid

                          Comment

                          • spl

                            #14
                            Re: How to replace /(division) operator

                            Thanks Bartc & Eric. Your suggestions are very useful. By the way all
                            my variables are unsigned int only. So right shift gives me exact
                            value.

                            Comment

                            • thomas.mertes@gmx.at

                              #15
                              Re: How to replace /(division) operator

                              On 28 Apr., 14:15, Eric Sosman <esos...@ieee-dot-org.invalidwrot e:
                              Bartc wrote:
                              "spl" <splender....@g mail.comwrote in message
                              news:ff9f8829-852d-4ab4-b05f-a96148cd0e9d@y3 8g2000hsy.googl egroups.com...
                              Sorry for the delay in getting back to your questions, Actually
                              changing the division operator to bitwise operators is suggested by my
                              tech lead. As she done so many such improvement by doing this and she
                              is having enough evidence for the same. She suggested me to do the
                              same in my current project too. Actually I want to divide some big
                              number with constant number, say 1024 always. Please give me your
                              suggestion please.
                              >
                              My suggestion is to just divide by 1024.
                              >
                              Your compiler will use the most appropriate coding, you probably don't even
                              have to tell it to optimise.
                              >
                              Only if your compiler is so basic that you might try using (A>>10) instead
                              of A/1024, if A is an appropriate type like int, followed by a comment as to
                              why you are doing this.
                              >
                              Pay close attention to that "appropriat e type" part, and
                              view "like int" with caution. The problem is that the result
                              of right-shifting a negative number is implementation-defined,
                              and is usually not the same as the result of dividing by two.
                              For example, on the two's complement machines that are all
                              but universal nowadays the representation of -1 is a string
                              of 1-bits. Shift the string one place to the right and you
                              may get another string of 1-bits ("arithmetic shift") or a
                              single 0-bit followed by 1-bits ("logical shift"). The first
                              thus gives -1 again, while the second gives a large positive
                              result -- but neither gives the correct result -1 / 2 == 0.
                              >
                              So: "appropriat e type" means either an *unsigned* integer
                              or a signed integer that you happen to know is non-negative.
                              Agreed.
                              There can be even more problems with negative numbers.
                              IMHO the definition of the division in C89 allows also
                              -1 / 2 == -1. Although I did not find a C compiler which
                              does this, it is theoretically possible since in C89 the
                              division is defined as follows:

                              The binary / operator yields the quotient, and the % operator
                              the remainder, of the first operand by the second; if the
                              second operand is 0, the result is undefined. Otherwise, it
                              is always true that (a/b)*b + a%b is equal to a. If both
                              operands are non-negative, the remainder is non-negative and
                              smaller than the divisor; if not it is guaranteed only that
                              the absolute value of the remainder is smaller than the
                              absolute value of the divisor.

                              As said before this definition allows that the integer
                              division can be rounded towards minus infinite.
                              Note that when -1 / 2 == -1 at the same time -1 % 2 == 1

                              IMHO this definition was chosen to allow integer operations
                              with one machine instruction.

                              Greetings Thomas Mertes

                              Seed7 Homepage: http://seed7.sourceforge.net
                              Seed7 - The extensible programming language: User defined statements
                              and operators, abstract data types, templates without special
                              syntax, OO with interfaces and multiple dispatch, statically typed,
                              interpreted or compiled, portable, runs under linux/unix/windows.

                              Comment

                              Working...