Visual Studioのパフォーマンスプロファイラーを使ってみた

こんにちは、弥生の木村です。
この記事は弥生 Advent Calendar 2020の13日目のエントリーになります。
簡単に自己紹介です。

2019年4月:新卒入社  
2019年6月:開発本部に配属。開発研修(Java/HTML/CSS/JavaScript)  
2019年11月:自動テスト開発・運用チームのエンジニア(C#)  
2020年4月以降:会計オンラインのエンジニア(ASP.NET MVC)  

エンジニア歴2年目のまだまだ若手です。
今回は、VisualStudioのパフォーマンスプロファイラーを使ってみたお話です。

きっかけ

社内資料の中に、品質高く効率的な開発を進めるための支援ツールの例として以下が挙がっていました。

  1. 単体テスト
  2. カバレッジ分析
  3. 静的コード解析
  4. プロファイラー

「プロファイラー?何それ?」状態だった私。
エンジニアとして早めに押さえておこう!と思い、今回勉強しました。

※参考

Visual Studio でアプリのパフォーマンスを測定する

プロファイラーとは?

プログラムが実行される様子を監視・記録し、その性能の解析ができます。
プログラムの性能とは、実行時間、CPU使用率、メモリ使用量などです。
プロファイラーを使うことで、「なんか処理が遅いけどなんで?」という時にボトルネックになっている関数を見つけたり、「メモリリーク起こしてるよ...」という時にメモリを大量に消費している処理を特定できたりします。

使ってみよう

今回は普段開発で使用しているVisualStudioの「パフォーマンスプロファイラー」を使ってみます。

サンプルプログラム

10万行の文字列を読み込み、1つの文章に連結して出力する単純なプログラムです。

class Program
{
    public static void Main(string[] args)
    {
        int lineCount = 100000;
        string[] lines = Import(lineCount);
        string text = Concat(lines);
        Output(text);
    }

    // 各行を取り込む
    public static string[] Import(int lineCount)
    {
        string[] lines = new string[lineCount];
        for (int i = 0; i < lineCount; i++)
        {
            lines[i] = "sample";
        }
        return lines;
    }

    // 各行を連結する
    public static string Concat(string[] lines)
    {
        string text = "";
        for (int i = 0; i < lines.Length; i++)
        {
            text += lines[i];
        }
        return text;
    }

    // 文章を出力する
    public static void Output(string text)
    {
        Console.WriteLine(text);
    }
}

1.パフォーマンスプロファイラーの起動

パフォーマンスプロファイラーの起動の手順は以下のとおりです。

手順1. デバッグ>パフォーマンス プロファイラー
f:id:ym_AdventC:20201208185426j:plain

手順2. 分析ターゲット、ツールを選択して開始
f:id:ym_AdventC:20201208185539j:plain

そうするとデバッグ起動が開始されます。

2.分析結果の確認

処理が最後まで終わると診断結果が表示され、主に以下を確認できます。

  • 診断セッション:処理秒数
  • 上位の関数:CPU使用率が高い関数
  • ホットパス:ボトルネックとなる関数

f:id:ym_AdventC:20201208185657j:plain

Main関数がボトルネックとなっていますが、具体的にどの処理が原因なのでしょうか。
さらに見ていきます。

f:id:ym_AdventC:20201208185712j:plain

Concat関数が原因のようです。
モジュールシンボルを読み込み、ソースコード上で確認します。

f:id:ym_AdventC:20201208185723j:plain

f:id:ym_AdventC:20201208185741j:plain

「text += lines[i];」が赤くなっていますね。
どうやら、Concat関数の文字列追加処理が根本原因のようです。

3.ボトルネックを改善

では、ボトルネックの処理を修正してみます。

<変更前>

// 各行を連結する
public static string Concat(string[] lines)
{
    string text = "";
    for (int i = 0; i < lines.Length; i++)
    {
        text += lines[i];
    }
    return text;
}

<変更後>
文字列追加処理をより軽量で行うことができる「StringBuilderクラス」を用いる方法に置き換えます。

// 各行を連結する
public static string Concat(string[] lines)
{
    StringBuilder text = new StringBuilder();
    for (int i = 0; i < lines.Length; i++)
    {
        text.Append(lines[i]);
    }
    return text.ToString();
}

再度、パフォーマンスプロファイラーを起動し測定します。

f:id:ym_AdventC:20201208185803j:plain

修正前 修正後
処理時間 22.147秒 6.765秒

改善により、処理時間は約1/3に短縮しました!

まとめ

今回初めてパフォーマンスプロファイラーを使ってみました。
プログラムは単純な例でしたが、これが大規模で複雑なプログラムであるほど助かる機能なのかなと思いました。
今後、会計オンラインの業務でも使ってみようと思います。
パフォーマンスプロファイラーを使ったことのない方の参考になれば幸いです!

会計ソフト開発が楽しい4つの理由

弥生会計のエンジニアをしています、竹山と申します。
この記事は 弥生 Advent Calendar 2020 の7日目の記事です。

私は弥生に中途入社してから、弥生会計の開発に携わり2年が過ぎました。
現在は、入社して3回目の確定申告期間に向けて、弥生会計の「所得税確定申告モジュール」の開発に取り組んでいます。私はこれまで(前職含めて)会計ソフトの開発に携わった期間が長かったので、今年のアドベントカレンダーでは、会計ソフトの開発について書いてみたいと思います。

会計ソフトを作る楽しさを伝えたい

会計ソフトの開発はとても楽しいです!
しかし、「会計ソフトの開発」と聞いて、堅いイメージを持たれる方も多いようです。 何年か前に母校の大学の研究室を訪問した時、大学の先生から「会計というものにイメージがわかず、選択肢に入りにくい」というお話を伺いました。
それは確かに納得できることで、私は高校の頃に簿記と出会い学ぶ機会がありましたが、大学で理系の学部に入ると、他学部の科目を履修しない限り簿記に関わる機会は全くありませんでした。エンジニアになる人の多くはなかなか会計を知る機会がないと思われます。

しかし、会計ソフトの開発はエンジニアにとって格好のテーマになり得ると思うのです。

会計ソフトとは?

何となくお金を計算するイメージがある「会計」は、Wikipediaで調べると以下のように出てきます。(会計 - Wikipedia)

「多くの場合、会計という語は企業などの組織における会計を指し、金銭や物品の出納を、貨幣を単位として記録、計算、管理等することを意味する。これは情報の利用者が事情に精通した上で判断や意思決定を行うことができるように、経済的な情報を識別し、測定し、伝達するプロセスであり、「経理」とも称される。」

難しい表現ではありますが、日々の事業活動を記録して、集計して、決算書にまとめることで、事業活動をされる方やその利害関係者が意思決定をできるようにすることです。 具体的には、取引を帳簿に記録して、集計して、決算書を作成します。決算書は、税務申告のときや、銀行にお金を借りるとき、株主総会のとき、自分が経営判断をするときなど、色々な目的で使います。

そして、これら会計の一連の流れを行うソフトが、会計ソフトです。

楽しい理由① 会計ソフトは役に立つ

会計ソフトは、会計で必要となる様々な作業を効率化します。 会計ソフトの開発を行うことで、企業や個人事業主の力になることができます。

簿記の手続きをかんたんにします

簿記に少し触れると、その作業の手間に驚きます。
仕訳を起こし、総勘定元帳に転記し、試算表に集計して合計残高を確認し、精算表を作って決算整理を行い、決算書を作成します。それは、紙の上でデータを変換する作業の連続です。

しかし、会計ソフトなら取引を入力すればあとの集計や帳票の作成は自動で行ってくれますから簡単です。税務帳票は定められた様式で出力するので、そのまま税務署への提出に利用することができます。

手作業の場合 会計ソフト(弥生会計)の場合
仕訳を起こす レシートなどから自動仕訳(スマート取引取込)、または入力
総勘定元帳に転記する 自動で作れる
試算表に集計する 自動で作れる
精算表で決算整理 決算整理仕訳を入力する
(精算表はない)
決算書を作成 様式通りの決算書を自動作成

消費税の計算をかんたんにします

消費税には様々な計算方式があり、それも取引の種類ごとに処理が異なるので、手作業では大変です。 会計ソフトに入力する取引データには「税区分」という項目があり、これに従って消費税が正確に計算されます。

税務申告をかんたんにします

税務申告には電子申告(e-Tax)が使用できます。会計ソフトのデータを、会計ソフトの画面からe-Taxに送信することもできます。(確定申告e-Taxモジュール

経営判断の材料になります

入力したデータを分析したり、グラフで表示したりすることができ、経営者が経営判断をするための役に立ちます。

楽しい理由② 複式簿記の仕組みが美しい

今日の一般的な簿記の方法である複式簿記では、取引をお金の増減とその要因など、2つの要素(借方と貸方)に分けて仕訳(記帳)します。こうすることで、お金の出入りと同時に、どんな収益や費用が発生したかも把握できます。また2つの要素(借方と貸方)の金額をそれぞれ集計してエラーチェックができます。
そして、お金の増減と収益-費用の2つの側面から利益を計算することができ、これらは最終的にピタリと合います。

複式簿記の仕組みは、大昔(諸説ありますが、15世紀ごろにイタリアで広まったと言われています)に作られたにもかかわらず、プログラムで表現しやすい仕組みになっています。 まるで、勘定科目でリンクされているデータベースのようです。

このような古くからの仕組みを現代のコンピューターシステムで実装していることがすごいと思います。

楽しい理由③ 法令改正対応で社会とのつながりを感じる

複式簿記の仕組みという面では古くから確立されていますが、法令という面では、時代とともに変化しています。

個人事業を営まれる方のための会計ソフトにとって一番大事なイベントが、確定申告です。
毎年のように法令が改正され様式が変更されるので、それに合わせた開発を毎年行います。様々な新機能の開発もありますが、第一に守らなければならないのは、法令改正に迅速・正確に対応することです。法令改正に目を光らせ、改正内容を理解して、いかに効率的に製品の機能に落とし込むかを意識しています。

税法の独特の表現に戸惑うこともありますが、読み解いていくと、緻密に論理立てられていることに気付きます。最近では年ごとの改正内容が複雑な場合もありますが、毎年新たな課題と向き合えることや、制度の変化を間近に感じられることが会計ソフトのエンジニアならではの体験だと思います。

楽しい理由④ より便利な未来を作れる

法令に対応するだけではありません。お客様の使い勝手がよくなるよう常に工夫しますし、より大きな進化として、業界を通して次世代のシステムを検討・提言する活動も始まっています。

未来の社会システムはどうなっているでしょう?
また、その中で会計ソフトはどのような姿になっているでしょう?
長い会計の歴史、コンピュータの歴史を見てみると、会計や社会システムと技術が呼応するように現在のシステムに成長してきたと思います。今後も、デジタル化への取り組みや新しい技術によってさらに便利な社会へ進化していていく予感がして、ワクワクします。会計ソフトの開発を行うことは、広い意味では会計の歴史の中の一コマを刻もうとしているようにも感じます。

まとめ

壮大な夢を描きながら、法令対応の責任を担いながら、会計ソフトの開発は日々進められています。
個別の技術については記載しませんでしたが、今後の変化に対し、様々な技術が選択肢に上がってきます。 会計ソフトの開発は、エンジニアとしてとても魅力的なテーマだと思います。世の中のエンジニアの方や、これからエンジニアを目指す方にも、会計ソフトの開発を選択肢に入れていただければ嬉しく思います。

www.yayoi-kk.co.jp

コロナ禍に弥生へ中途入社したエンジニアの物語

初めまして、今年の5月に中途入社しました情報システム部エンジニアの飯田です! この記事は弥生 Advent Calendar 2020の2日目の記事です。

2日目(このブログでは初回)なので私も最近のマイブームの技術ネタを…といきたいところですが、せっかくなので私にしか書けないこととして、コロナ禍に弥生へ入社してから今までのことについて書いていきたいと思います!

簡単な経歴

中小のITベンチャーで新卒から10年半ほど勤務し、JavaやAWSを使ったシステム開発や、DevOps活動としてCI/CDパイプラインの構築などを行っていました。

仕事内容は良かったのですが、もうちょっと腰を据えて1つのプロダクトに関わりたいと思ったのと、まあ他にも色々あって転職を決意。ただ、何はともあれ10年間頑張ったということでリフレッシュするため、あえて転職先は決めずに退職しました。

3か月ほど旅行したり資格を取ったりした後に転職活動を始め、エージェントからの紹介で弥生を知りました。選考が進むにつれて、自分が働いていた(そして色んな苦労もあった)中小企業などの支えとなる「事業コンシェルジュ」という弥生のビジョンに惹かれていき、結果無事に内定を頂けて入社を決意しました。

リモートワークから始まった弥生人生

こうして5月1日から弥生の一員となったのですが、依然として緊急事態宣言中だったため初日からリモートワークでした。さらに私の場合は採用面接からオファー面談、入社前オリエンまで全てリモートで行なっていたため、本社に行ったことがないどころか弥生の社員の誰とも会わないうちに仕事を始めることになったのです!まさかこのような形で弥生人生がスタートするとは思ってもいませんでした(笑)

そもそも仕事をすること自体が数か月ぶりというのもあって不安だらけの初日でしたが、Zoomでのコミュニケーションは転職活動時の面接ですっかり慣れていましたし、自宅の機材もある程度のものが揃っていたので、思っていたほどの苦労や不便はありませんでした。仕事が終わってZoom部屋から出た時には不安はすっかり消えていて、達成感があり今後もうまくやっていけそうな感じがしました。

入社後しばらくの間は導入教育を少しずつ受け、弥生の開発プロセスや製品などについて学びます。実はリフレッシュ期間中に偶然にも簿記を勉強していたので、会計ソフトを開発している弥生への入社は運命だったのかも知れませんね。もっとも、簿記の知識が活かせることに気付いたのは内定を承諾した後だったんですけどね。

その後もリモートワークが続きましたが、7月の頭に突然自宅でネットワークトラブルが発生し、急遽初出社を果たすことになりました。秋葉原に行くのは友達に連れられてメイド喫茶に行って以来約15年ぶりです。そして私のチームのPMであり開発本部のCTLである山川さんと初めてお会いして色々と話をすることができました。弥生の一員となったことを改めて実感した瞬間です。ちなみに(3Dの)山川さんを見た時の第一印象は「でかっ!」でした(笑) Zoom越しだと身長や体格が分からないんですよね。

チームメンバー全員との顔合わせも10月に実現し、今でもまだ計3回しか出社できていませんが、チームにはすっかり馴染めたのではないかと思います。残念ながら新型コロナの再流行によってまたしばらくの間リモートオンリーとなりそうですが、チームで協力して仕事を進めていきたいと思います。

情報システム部で開発しています

続いて仕事内容についてです。私が配属されたのは開発本部の情報システム部で、お客さまが弥生のサービスを契約する時に操作する画面や契約に関するバッチ処理などを行う課金管理システムを開発しているチームに入りました。前職ではこのような部分は単にツールを使って管理していましたが、弥生ほどのユーザー数で独自のプランやキャンペーンを運用するとなると専用のシステムが必要になるのですね。

弥生製品を開発しているわけではありませんが、やっていることは設計から実装、試験、リリース、そして保守・運用とシステム開発そのものと言えます。さらに、課金管理システムは弥生製品や他の社内システムとも連携しており、弥生のビジネスの基盤となる部分でもあるので、難しいことも多いですが独自の面白さがあると思います。

私も既にひと通りのプロセスを経験し、最近では要求や課題の検討・調査や若手メンバーのフォロー、実環境でのデータメンテナンス作業などを担当するようになってきました。「腰を据えて1つのプロダクトに関わりたい」という転職時の希望も実現しつつあり、対応の幅を広げて力を発揮していけたらと思います。

組織全体も少しずつ見えてきました

最後に組織について少々。前職と比べて従業員数が10倍以上である弥生という組織はまるで別世界…のはずなのですが、ほぼリモートワークということもあってまだまだ見えていない部分が多そうだというのが正直なところです。歓迎ランチや勉強会など、コロナ前は行われていたイベントが休止していたのも影響しているのかも知れません。

ただ、リモートワークが定着してきた最近では徐々に再開してきており、歓迎ランチ改めリモート交流会のおかげで他にどんなチームがあってどんな雰囲気なのかが体感できましたし、今年7月に弥生と合併した元Misocaのメンバーが主催しているリモートランチ会のおかげで他チームのメンバーと雑談する機会もできました。

10月にはオンラインでの社員総会も開催され、多くのお客さまを支える弥生のすごさを改めて感じると共に、弥生賞の発表で様々なチームやプロジェクトの取り組みを知ることができました。自分も中小企業ならではの組織活動を経験してきているので、弥生でもそういったところに食い込んでいきたいです。

また、開発本部全体の状況を共有する全体会は定期的に行われていますが、情報システム部のみの全体会も10月から始まり、部内のより細かい動きや目標などが見える・分かるようになってきました。そうそう、少し前にとある作業を自動化するツールを作ってチーム内で話したところ、思っていた以上に好評で情報システム部全体会で発表しようという流れになり、つい先日LTをしてきました!個人の取り組みにスポットを当ててもらえて嬉しかったですし、また何かしようという意欲にも繋がりますね。この時のLTの内容については、今後も取り組みを続けて来月以降に記事を書いていきたいと思いますのでお楽しみに!

これからも頑張っていきます!

以上、弥生に入社してからこれまでのことを書いてきました。入社から7か月が経ち新たな目標を立てたところなので、改めて気を引き締め、挑戦していきたいと思います。それではまたこのブログでお会いしましょう!