これを実行し、切り捨て/オーバー(アンダー)フローの問題を処理する方法はすでにありますか?
これらの問題にどのように対処したいかによって異なります。あなたが提案しているように見えるのは、byte
値をスケーリングされた値として扱うことです。現在、Javaにはスケーリングされた数値のサポートが組み込まれていないため、算術演算を慎重に行う必要があります...切り捨て、アンダーフロー、およびスケール調整を自分で処理します。
気をつければ…できます。
しかし、それは価値がありますか?
最初に考慮すべきことは、フィールドまたはローカル変数がorフィールドbyte
とまったく同じスペースを取ることです...32ビット。(または、64ビットマシンではさらに多くの可能性があります。)int
float
実際、バイトが実際にのメンバーである場合にのみ、メモリを節約しますbyte[]
。
次に、スペース削減を達成するための努力が本当に価値があるかどうかを自問する必要があります。これらのスケーリングされたバイト値がいくつあるかを測定しましたか?アプリケーションの他のメモリ使用量と比較しましたか?これらのスケーリングされたバイト値のうち、いくつを表す必要があるかさえ知っていますか?
また、これらの値も多くの計算に使用されるため、計算のオーバーヘッドをできるだけ避けたいと思います。
問題があります。スケーリングされた値を使用した算術演算では、特にオーバーフロー/アンダーフローを検出する場合は、追加の命令が必要になります。これにより、アプリケーションの速度が低下する傾向があります。
float
オーバーフローとアンダーフローの問題をすべて自動的に処理するアプリケーションを使用して実装する傾向があります。次に、実際のデータでアプリケーションを実行して、アプリケーションの速度と使用するメモリの量を確認します。
- 両方とも許容できる場合は、そのままにしておきます。
- メモリ使用量が多すぎるか、速度が遅すぎる場合は、これを修正する方法を検討してください。スケーリングされた数値アプローチを試すことにした場合:
float
およびを使用してキー計算を実装するbyte
- スケーリングされた算術コードを修正するためのテスト、および
- 両方のバージョンを慎重にベンチマークして、違いを定量化します。
結果がどうなるかは予測できません。しかし、多くの人が、最適化する必要のないコードを最適化するのに時間を浪費していると言えます。その間違いをしないでください-時期尚早に最適化しないでください。